PDA

View Full Version : حرفه ای: مشورت درباره تایع ضد sql injection و xss



xoogle.ir
جمعه 19 شهریور 1389, 22:04 عصر
سلام دوستان عزیز
امروز یه جستجویی در باره حملات sql injection و xss داشتم (بماند که همین امروز فهمیدم این 2 تا با هم فرق میکنن :لبخند:). توابع مختلفی برای این کار پیدا کردم که بعضی هاشون رو وقتی استفاده میکردم صفحه پر از ارور میشد :شیطان:

در نتیجه این تابع رو نوشتم و میخام که ازش استفاده کنم :




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);
}

function safe($unsafe){

if(is_array($unsafe)){

$tmp_array = array();

foreach($unsafe as $key => $value){

$tmp_array[$key] = safe($value);
}
return $tmp_array;
}else{

$safe = escape($unsafe, $link);

$safe = preg_replace('~<style(.*)>(.*)</style>~', '', $safe);
$safe = preg_replace('~<script(.*)>(.*)</script>~', '', $safe);
$regstr = '/(?<=<[ra])(.+\s)+|<[ra]/mi';
$safe = preg_replace($regstr, '', $safe);

return trim(strip_tags($safe));
}
}


حالا میخاستم شما نظر بدید ببینم این تابع چه ایراداتی داره و چه چیزهایی لازمه که فیلتر بشه ... اصلا نظر بدین ببینم باگ نداره ؟ خلاصه کمکم کنید که اگر این تابع مشکل داره کاملش کنم.
خیلی ممنون

Hell Lord
جمعه 19 شهریور 1389, 23:15 عصر
من خیلی وقت هست که از این دو دستور با هم استفاده میکنم و تا به حال مشکلی نداشته ام :

$safe = mysql_real_escape_string(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
و همچنین استفاده از intval() هم زمانی که بندانم ورودی ام فقط عدد است.
همچنین استفاده از این کد هم بد نیست! :شیطان:

$_GET = array_map('trim', $_GET);
$_POST = array_map('trim', $_POST);
$_COOKIE = array_map('trim', $_COOKIE);
$_REQUEST = array_map('trim', $_REQUEST);
if(get_magic_quotes_gpc()){
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_REQUEST = array_map('stripslashes', $_REQUEST);
}
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
$_REQUEST = array_map('mysql_real_escape_string', $_REQUEST);

xoogle.ir
شنبه 20 شهریور 1389, 00:07 صبح
این کد دومی رو جایی گذاشتید که توی تمام صفحات اجرا بشه دیگه ؟ درسته مثلا توی فایل config درست متوجه شدم ؟

Hell Lord
شنبه 20 شهریور 1389, 00:11 صبح
بله، میشود هم تبدیل کرد به یک تابع و از آن در اول تمام صفحات استفاده کرد. :لبخندساده:

xoogle.ir
شنبه 20 شهریور 1389, 14:22 عصر
فکر میکنم احتیاجی به نوشتن REQUEST_$ نیست و نوشتنش به صورت جدا ، دوباره کاری میشه.
دوستان کس دیگه ای نظری نداره ؟

binyaft
شنبه 20 شهریور 1389, 14:59 عصر
برای جلوگیری از XSS فک کنم تبدیل

<>
به

&lt; &gt;
کافی باشه !!
کافی نیست؟

sama01
شنبه 20 شهریور 1389, 17:29 عصر
من پیش‌نهاد می‌کنم این صفحه (http://forum.iranphp.org/Thread-%D9%BE%D8%A7%DA%A9%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%DB%8C%D9%85%D9%86-%D8%B3%D8%A7%D8%B2%DB%8C-XSS-%D9%88-SQL-injection) را ببینید.

xoogle.ir
شنبه 20 شهریور 1389, 17:33 عصر
قبلا دیدم :چشمک:

Hell Lord
شنبه 20 شهریور 1389, 18:53 عصر
یک add-on در فایر فاکس هست به اسم SQL Inject Me ، فکر میکنم خیلی به درد بخور باشد.
میتوانید صفحاتتون رو از این طریق چک کنید.

sama01
شنبه 20 شهریور 1389, 19:11 عصر
خیلی ممنونم.
دانلود کردم.
افزونه‌ی دیگری هم برای xss به نام XSS Me وجود دارد.

xoogle.ir
شنبه 20 شهریور 1389, 20:05 عصر
برای جلوگیری از XSS فک کنم تبدیل

<>به

&lt; &gt;کافی باشه !!
کافی نیست؟

چه کار باید کرد که این تبدیل انجام بشه ؟؟ :متفکر: چه توابعی بهتره ؟

binyaft
شنبه 20 شهریور 1389, 20:56 عصر
من با str_replace این کار رو انجام میدم

...!M.J!...
شنبه 20 شهریور 1389, 21:16 عصر
میتونی با استفاده از دستورات آماده که در mysqli ارائه شده برای همیشه با اینجکشن خدافظی کنید

من یه نمونه که مربوط به select گرفتن هست رو میزارم بقیه و توضیحات کامل منوآل خود php




$mysqli = new mysqli("localhost", "root", "", "mj");
if($stmt = $mysqli -> prepare("SELECT img,descript FROM mj_propaganda WHERE =?"))
{
$stmt -> bind_param("s", $input);
$input = "OpenS";
$stmt -> execute();
$stmt->bind_result($field );
$stmt -> fetch();
echo $field ;
$stmt -> close();
}
* $mysqli -> close();

نکته بعدی اینکه xss فقط همون حملات مربوط به <> نمیشه بیشر بگرد و ای این سایت هم غافل نشو بخش امنیتشو بخون حتما http://shiflett.org/

--------------------------

در ضمن اگه در مورد همین prepared statment هایی که نوشتم سوالی دارین بفرمایین تا توضیح بدم

hosseintdk775
شنبه 20 شهریور 1389, 21:17 عصر
بسم الله الرحمن الرحیم
سلام
خوب مگه htmlspecialchars همین کارو نمی کنه؟
دیگه چرا str_replace می کنید؟

Hell Lord
شنبه 20 شهریور 1389, 21:45 عصر
یک مثال خیلی جالب از sql injection در یکی از سایتها دیدم، خیلی جالب روابط بین کاربر و دیتابیس را و خطر آنرا نمایش داده است :لبخند:

http://imgs.xkcd.com/comics/exploits_of_a_mom.png


:بامزه:

binyaft
یک شنبه 21 شهریور 1389, 10:35 صبح
من اول نمیدونستم که htmlspecialchars از utf8 پشتیبانی میکنه :بامزه:

...!M.J!...
یک شنبه 21 شهریور 1389, 16:54 عصر
من یه مطلب جالب خوندم توی این سایت : http://shiflett.org/blog/2005/dec/google-xss-example

بد نیست یه نگاهی بندازین تا ببینیم اگه utf-8 بشه utf-7 یکم مشکل داریم

tehro0n
دوشنبه 22 شهریور 1389, 02:36 صبح
این روش هم خوبه


function str_escape ($str, $con=null)
{
if (get_magic_quotes_gpc())
$str = stripslashes ($str);

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

if (isset($_GET['name'])) {
$name = str_escape($_GET['name']);
}