PDA

View Full Version : sql injection چیست ؟



sassan.samiei
دوشنبه 18 خرداد 1388, 19:23 عصر
sql injection چیست ؟

adinochestva
دوشنبه 18 خرداد 1388, 20:40 عصر
http://fu20.com/article/?p=1

امیـرحسین
دوشنبه 18 خرداد 1388, 21:08 عصر
خلاصه اش اینه که اگر اطلاعاتی که از کاربر میگیری رو مستقیما توی دستور SQL بذاری، کاربر می تونه با وارد کردن ورودی خاص، خروجی دستور SQL رو تغییر بده. مثلا:

$userId = $_POST['id'];
mysql_query("SELECT `name` FROM `table` WHERE id='$userId'");
که اگر کاربر مثلا 5 رو وارد کنه، اطلاعات کاربر شماره 5 میاد. حالا اگر کاربر عبارت زیر رو بجای 5 وارد کنه:

5'; DROP TABLE `table` WHERE '1
دستور SQL این شکلی میشه:

SELECT `name` FROM `table` WHERE id='5'; DROP TABLE `table` WHERE '1'
تو این مایه ها.....

این رو ببینید: SQL Injection Attacks by Example (http://unixwiz.net/techtips/sql-injection.html)

sassan.samiei
دوشنبه 18 خرداد 1388, 21:40 عصر
چطوری میشه از این کار جلوگیری کرد ؟

امیـرحسین
سه شنبه 19 خرداد 1388, 01:34 صبح
توابع مخصوص این کار، mysql_escape_string (http://ir.php.net/manual/en/function.mysql-escape-string.php)و mysql_real_escape_string (http://ir.php.net/manual/en/function.mysql-real-escape-string.php)هستند که میان کوتیشن ها رو با backslash خنثی می کنند اما این توابع موقعی صحیح کار می کنند که magaic_quotes_gpc غیرفعال باشه وگرنه این تابع معکوس عمل می کنه و کوتیشنهای خنثی شده رو فعال می کنه! یک کلاس خوب برای این کار تو انجمن هست که من الان سرچ کردم پیدا نکردم. این تابع کار اون کلاس رو می کنه:

/**
* Escape strings to use in SQL commands.
*
* @param string $str String to escape.
* @param resource $connection Connected MySQL connection.
* @return string Escaped string.
*/
function escape($str, $connection=null)
{
if(get_magic_quotes_gpc())
$str = stripslashes($str);

if(function_exists('mysql_real_escape_string') && $connection)
return mysql_real_escape_string($str, $connection);
else
return mysql_escape_string($str);
}

amirhosein
سه شنبه 19 خرداد 1388, 09:04 صبح
قاعده کلی اینه که هیچ وقت به ورودی های کاربر نباید اعتماد کنید. احتمال اینو هم بدید که کاربر شما یه هکر تشریف داشته باشه و از این بابت همه ورودیهای کاربر رو باید فیلتر کرد. اگه قراره که مقدار یه فیلد عددی باشه حتماً بررسی کنید که ورودی کاربر عدد باشه و چیز دیگه ای قاطیش نباشه و بهمین ترتیب.