PDA

View Full Version : mysql_real_escape_string و htmlentities در مقابل توابع ctype_digit ، int و ...



idocsidocs
دوشنبه 09 مرداد 1391, 00:16 صبح
فرض کنید یه رشته عددی رو بدون چک کردن می خواید امن کنید و توی دیتابیس ذخیره کنید.

کدم روش مطمئن تر هست؟



$str=htmlentities($str, ENT_QUOTES,'UTF-8');
$str=real_escape_string($str);

یا

$id=(int)$_GET['id']

Unique
دوشنبه 09 مرداد 1391, 01:21 صبح
این کار ها لازم نیست ! با تابع ctype_digit مطمئن بشین که مقدارش عددیه ! و اگه نبود یا روند اسکریپت را متوقف کنید یا مقدار پیش فرض بگذارین !
برای محکم کاری هم از sprintf استفاده کنید و با d% مطمئن بشین مقدار عددی در query قرار میگیره !

امکان injection با استفاده از موارد بالا در حالت عددی غیر ممکنه !

idocsidocs
سه شنبه 10 مرداد 1391, 13:39 عصر
من برای ایجاد امنیت توی ورودی های کاربر از این روش استفاده می کنم:

$str=htmlentities($str, ENT_QUOTES,'UTF-8');
$str=real_escape_string($str);

چه ورودی عددی باشه، چه متن و... فرقی نمی کنه برام و قبل از اینسرت کردن فقط از این دوتابع استفاده می کنم.
آیا امکان دور زدن این دو تابع و نفوذ به دیتابیس وجود داره؟

Unique
سه شنبه 10 مرداد 1391, 16:19 عصر
htmlentities شما را مطمئن میکنه که متنی که کاربر داده از فرمت Html خارج میشه ! بیشتر برای XSS هست ا injection
"امکان دور زدن تابع دوم در صورتی که مسائل زیر را رعایت نکنین وجود داره !
سه تا موضوع مهم :
اول اینکه در زمان ارتباط با Database بجای این دو خط کد :

query("SET NAMES 'utf8'");
query("SET character_set_connection = 'utf8'");
از این تابع استفاده کنید :

mysql_set_charset('utf8',$link_id);

دوم اگه مقدار get_magic_quotes_runtime() برابر با true باشه ! حتما باید از stripslashes استفاده کنید و سپس برای سومین مرحله از تابع :

mysql_real_escape_string($string,$link_id)

اما خود من بیشتر ترجیه میدم از parametrized query ها در mysqli و pdo استفاده کنم ! استفاده از stored procedure ها هم واقعا امنیت بسیار بالایی به وجود میاره.

idocsidocs
سه شنبه 10 مرداد 1391, 17:13 عصر
من از کلاس mysqli استفاده می کنم.
قبل از ارسال کوئری به دیتابیس از این کد استفاده می کنم:

$this->db->set_charset('UTF8');
اگر get_magic_quotes_runtime ست بود از stripslashes استفاده می کنم.
بعد از کد زیر استفاده می کنم:

$this->db->real_escape_string
بعد هم اینسرت می کنم.

بنظرتون این کاری که انجام می دم امنیت استانداردی (چون شاید یه هکر توی پی اچ پی باگ پیدا کنه و... گفتم استاندارد) ایجاد می کنه یا نه؟

الان چندتا کار بهم دادن و امنیت برام مهم هست.

Unique
سه شنبه 10 مرداد 1391, 20:14 عصر
اگه دارین از کلاس خود mysqli استفاده میکنید دارین از همون توابع در قالب شی استفاده میکنید و درسته !
نباید مشکل خاصی پیش بیاد این مسیر یک روش کاملا استاندارد هستش.