PDA

View Full Version : سوال: کمک برای جلوگیری از SQL Injection



mamali-mohammad
جمعه 15 دی 1391, 14:12 عصر
سلام
داشتم یه برنامه چک میکردم
متوجه شدم mysql_real_escape_string به تنهایی نمیتونه جلوی این حمله رو بگیره
بهتره که stripslashes استفاده بشه و همچنین ورودی ها فیلتر بشن

مثلا اگه محتوا عددی هست بهتره از این استفاده کرد :

if (is_numeric($id))
بعدش ادامه کارو رفت
حالا من سوال دارم

1- از stripslashes و mysql_real_escape_string استفاده بشه ؟
2- برای اعداد این کد رو میزنم اول :

$sid=preg_replace('#[^0-9]#i','',$_GET['id']);
3- برای اعداد و حروف انگلیسی :

$sid=preg_replace('#[^A-Z-a-z-0-9]#i','',$_GET['id']);
4- برای اعداد و حروف انگلیسی و حروف فارسی :

$sid=preg_replace('#[^A-Z-a-z-0-9\ا\ب\پ\ت\ث\ج\چ\ح\خ\د\ذ\ر\ز\ژ\س\ش\ ص\ض\ط\ظ\ع\غ\ف\ق\ک\گ\ل\م\ن\و\ه\ی\ك \آ\ي\ئ]#i','',$_GET['id']);

اگه مورد 2 استفاده بشه و تمام ورودی ها فقط عدد بشن ، آیا نیاز به مورد 1 هست ؟
مورد 4 از نظر منطقی صحیح هست ؟
ممنون

tehro0n
جمعه 15 دی 1391, 14:35 عصر
مورد 4 رو نمی دونم تا حالا ندیده بودم، ولی مورد 3 کار 2 رو می کنه و در ورودی کاراکترها هم باید از escape استفاده کنید..
شما به جای مورد 4 می تونید از htmlspecialchars و urldecode استفاده کنید، البته دیکد کردن وقتی هست که ورودی شما هنگام ارسال انکد بشه

mamali-mohammad
جمعه 15 دی 1391, 14:40 عصر
مشکل دیکد کردن نیست
مشکل ورودی برای کشیدن اطلاعات به بیرون هست
فرض کنیم قرار در سایت جستجو بشه
خب اطلاعات رو بر اساس GET میگیره دیگه
این متغیر رو حتما باید escape کنیم یا با فیلتر کردن مورد 4 مشکل حل میشه ؟

tehro0n
جمعه 15 دی 1391, 15:08 عصر
ببینید وقتی htmlspecialchars میزنید کاراکترهای غیر مجاز رو مجاز می کنه و وقتی در نهایت هم escape می کنید دیگه نیازی به مورد 4 نیست، برای حروف فارسی هم می تونید از انکد و دیکد استفاده کنید که به اعداد و حروف انگلیسی تبدیل بشه پس 4 حذف میشه..

rezaonline.net
جمعه 15 دی 1391, 15:37 عصر
mamali-mohammad (http://barnamenevis.org/member.php?106765-mamali-mohammad) یه بار از PDO استفاده کن ، یه عمر شب آسوده بخواد .
دیگه این دنگ و فنگ هارو نداری

colors
جمعه 15 دی 1391, 15:47 عصر
سلام

این تابع رو جناب eshpilen نوشتن. عالیه...

function quote_smart($value, $identifier=false)
{

if(!is_numeric($value)) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
if(!$identifier) return "'" .mysql_real_escape_string($value) . "'";
else if(strpos($value, '`')===false) return '`' .$value . '`';
else {
$this->error("Value contains invalid character (backtick - '`') for identifiers");
return false;
}
}
else return $value;

}

فقط کافیه مقدیر رو بدن هیچ کوتیشنی ( " or ' ) بهش بدین

soroush.r70
جمعه 15 دی 1391, 20:09 عصر
سلام

این تابع رو جناب eshpilen نوشتن. عالیه...

function quote_smart($value, $identifier=false)
{

if(!is_numeric($value)) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
if(!$identifier) return "'" .mysql_real_escape_string($value) . "'";
else if(strpos($value, '`')===false) return '`' .$value . '`';
else {
$this->error("Value contains invalid character (backtick - '`') for identifiers");
return false;
}
}
else return $value;

}

فقط کافیه مقدیر رو بدن هیچ کوتیشنی ( " or ' ) بهش بدین


من از این سورس به این صورت استفاده میکنم اونو قرار می دم در داخل کلاس خودم و به این صورت در متدهای post و get صدا می زنم درسته



$id=$class->quote_smart($_GET['id']);


$name=$class->quote_smart($_post['name']);

colors
جمعه 15 دی 1391, 21:29 عصر
من از این سورس به این صورت استفاده میکنم اونو قرار می دم در داخل کلاس خودم و به این صورت در متدهای post و get صدا می زنم درسته



$id=$class->quote_smart($_GET['id']);


$name=$class->quote_smart($_post['name']);

بله درسته...