PDA

View Full Version : stripslashes و mysql_real_escape_string با هم



Vahid Faraji
پنج شنبه 04 شهریور 1389, 21:11 عصر
كد زير براي anti sql injection هست ولي يه سوال


function inputFilter($var)
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}


strip_tags, htmlentities تكليفشون معلومه و مشكلي نداره ولي وقتي مي آيم از stripslashes استفاده مي كنيم يعني بيا \ از پشت سينگل يا دابل كت حذف كن بعدش مي آييم از mysql_real_escape_string استفاده مي كنيم يعني پشت سينگل يا دابل كت \ بزار اين كار براي چيه، مفهومش چيه؟

امیـرحسین
پنج شنبه 04 شهریور 1389, 21:30 عصر
اگر متن escape شده باشه، هیچ کاری نباید بکنیم چون escape شده ولی از اونجایی که نمی دونیم، با stripslashes، از escape خارجش می کنیم و خودمون توسط mysql_real_escape_string فیلترش می کنیم.
اهمیت این موضوع اینجاست که وقتی متنی با slash فیلتر میشه، اگر دوباره بخواد Escape شه، به همه کوتیشن ها یک backslash اضافه میشه و چون قبلا escape شده بوده و backslash داشته، با این میشه دو تا backslash کنار هم که یعنی هیچی، انگار هیچ backslashای وجود نداره. در عمل یعنی ما متن رو از escape خارج کردیم.

Vahid Faraji
پنج شنبه 04 شهریور 1389, 21:36 عصر
من از شما (امير حسين) واقعا ممنونم. شما واقعا مفهومي جواب دادي. حالا يه سوال، مي شه بگين مفهوم كد زير چيه


function Safe_SQL($Str_Input)
{

if(get_magic_quotes_gpc()): function_exists('mysql_real_escape_string') ? stripslashes(mysql_real_escape_string(&$Str_Input)) : stripslashes(mysql_escape_string(&$Str_Input));
else: function_exists('mysql_real_escape_string') ? addslashes(mysql_real_escape_string(&$Str_Input)) : addslashes(mysql_escape_string(&$Str_Input));
endif;

return($Str_Input);
}


مثلا يه قسمتش مي گه


addslashes(mysql_real_escape_string(&$Str_Input))

اين يعني چي؟ يه بار مي آد با mysql_real_escape_string يه \ اضافه مي كنه و بعدش مي آد با addslashes يه \ ديگه اضافه مي كنه، چرا؟ اين جور كه شما گفتيد، این میشه دو تا Slash کنار هم که یعنی هیچی، انگار هیچ Slashای وجود نداره. در عمل یعنی ما متن رو از escape خارج کردیم.

eshpilen
پنج شنبه 04 شهریور 1389, 23:22 عصر
کدش رو از کجا آوردی؟

امیـرحسین
جمعه 05 شهریور 1389, 03:04 صبح
از تابع زیر استفاده کنید:

توابع مخصوص این کار، 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);
}

Vahid Faraji
جمعه 05 شهریور 1389, 11:10 صبح
با تشكر از شما امير حسين عزيز.
اگه امكانش هست (شما يا دوستان عزيز) به تابع زير هم نگاهي بندازيد. فكر كنم بد نباشه. به كامنت هاش هم نگاه بندازيد.



function mysql_prep($value){
if (function_exists("mysql_real_escape_string")) // i.e. PHP >= v4.3.0
{ // PHP v4.3.0 or higher
// undo any magic quote effects so mysql_real_escape_string can do the work
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
$value = mysql_real_escape_string($value);
}
else
{ // before PHP v4.3.0
// if magic quotes aren't already on then add slashes manually
if (!get_magic_quotes_gpc())
{
$value = addslashes($value);
}
// if magic quotes are active, then the slashes already exist
}
return $value;
};

rapidpich
جمعه 05 شهریور 1389, 11:32 صبح
شما که موضوع رو گرفتی دیگه چرا میپیچونیش؟

Vahid Faraji
جمعه 05 شهریور 1389, 11:41 صبح
شما که موضوع رو گرفتی دیگه چرا میپیچونیش؟

بحث پيچوندن نيست، فكر كنم اشكالي نداشته باشه، ما بتونيم يه تابع كامل و صحيح براي اين مساله پيدا كنيم و از نظر مفهومي تسلط كامل روش داشته باشيم.