PDA

View Full Version : مبتدی: امنیت اسکریپت + sql injection



mosavi7
یک شنبه 13 اسفند 1391, 19:14 عصر
با سلام و عرض ادب
دوستان یک سیستم ارسال تیکت رو دارم می نویسم (البته در حد مبتدی :لبخندساده:) .
ورودی ها اسکریپت بالا 100 هست , میخوام یه خورده رو امنیتش کار کنم , چطور میتونم یه فانکشن بنویسم برای همه ورودی هام که با sql injection مواجه نشم ؟؟
و با چه نرم افزاری میتونم باگ ها رو چک کنم ؟؟
ممنون میشم بنده رو راهنمایی کنید .

AbiriAmir
یک شنبه 13 اسفند 1391, 19:54 عصر
این رو توی 1 فایل که همه جا اینکلود میشه ( مثلا config.php ) بنویسید:



function safe( &$value, $key ) {
$value = trim( $value );
$value = stripslashes( $value );
$value = mysql_real_escape_string( $value );
}
array_walk_recursive( $_POST, 'safe' );
array_walk_recursive( $_GET, 'safe' );

mosavi7
دوشنبه 14 اسفند 1391, 10:45 صبح
با سلام
- هیچ مقداری نیاز نیست بهش بدیم ؟؟
- حالا راهی هست که از امن بودن اسکریپت مطمئن بشیم (منظورم تا حدودی هست که جوجه هکرها نتونن با ترفندهای ساده بتونن اسکریپت رو دور بزنن) ؟

omidabedi
دوشنبه 14 اسفند 1391, 11:20 صبح
نه دیگه گفته هر post و get که تو صفحه استفاده بشه از این فیلتر بگذره.
LIKE

AbiriAmir
دوشنبه 14 اسفند 1391, 13:23 عصر
از امن بودن چی مطمئن بشید؟
راهی که بنده گفتم یا کلا اسکریپت؟
ببینید ما انواع حملات داریم
کدی که بنده دادم خدمتتون کل ورودی ها رو از تابع mysql_real_escape_string میگذرونه
پس سایت شما در برابر حملات sql injection امن میشه
اما حملاتی مثل xss میمونه
مثلا اگر در اسکریپت شما جایی نیست که نیاز باشه کد html وارد بشه بهتره از صافی strip_tags یا htmlspecialchars هم بگذرونیدش که کسی کد js واردش نکنه... ( با این حملات میشه سایت رو هم دیفیس کرد. به طور مثال وارد کردن کد js در بخش نظرات 1 سایت خبری )
روش سمت سرور رو هم اگر درست اعمال بشه نمیشه دور زد دوست عزیز :چشمک:

imanitc
دوشنبه 14 اسفند 1391, 13:42 عصر
با سلام
من این کد ها رو استفاده کردم ولی مطمئن نیستم جواب داده باشه راهی هست بشه چک کرد ؟

AbiriAmir
دوشنبه 14 اسفند 1391, 13:50 عصر
مطمئن نیستید جواب داده باشه؟!
شما 1 نگاه به کد بکنید میفهمید جواب میده یا نه! همون کاری که همه به ازای هر فیلدی انجامش میدن (فیلتر کردن) توی این کد اتوماتیک روی تمام ورودی ها انجام شده... مشکلتون کجاست؟
خیلی اصرار دارید ببینید درسته یا نه کد sql توی فیلدهاتون وارد کنید
به عبارتی حمله sql injection رو شبیه سازی بکنید ببینید جواب داده یا نداده!

imanitc
دوشنبه 14 اسفند 1391, 13:55 عصر
این کد من استفاده کردم ولی هیچ کار خاصی انجام نمیده حتی sql هم زدم

<?php
function safe( $key, &$value ) {
$value = mysql_real_escape_string( $value );
}

array_walk_recursive( $_POST, 'safe' );
array_walk_recursive( $_GET, 'safe' );

?>
<form action="" method="post">
<input name="test" type="text" />
<input name="" type="submit" />
</form>
<hr />
<?php
echo $_POST['test'];
?>

AbiriAmir
دوشنبه 14 اسفند 1391, 14:04 عصر
دوست عزیز قرار هم نیست تغییری توی echo ایجاد شه
این توی query ها تاثیر میذاره و مانع از sql injection میشه
شما توی php کد زیر رو بزن ببین چی میبینی:


echo mysql_real_escape_string( "' or '' = '" );

اون چیزی که شما میخواین (که توی خروجی تغییر ایجاد کنه) تابع addslasehs هست...
( توی همون کدی که نوشتید mysql_real_escape_string رو با addslashes جایگزین کنید متوجه میشید که کار داره انجام میشه )

codedme
دوشنبه 14 اسفند 1391, 14:13 عصر
سلام
مطالبی که امیر جان گفتند کاملا صحیح هست شما قبل از اینکه مقادیری که کاربر در فرم وارد کرده رو مستقیما به دیتابیس بفرستید، باید اونها رو در فانکشنی که امیر جان دادن قرار بدین تا اونها رو از نظر sql امن بکنه تا خللی در query ایجاد نشه.

حالا اگر می خواهید خودتون هم خیالتون راحت بشه ( تا حدودی) می تونید این نرم افزار رو دانلود کنید و باهاش سایتتون رو اسکن کنید ببینید مشکلی از نظر sql نداشته باشه
http://www.acunetix.com/vulnerability-scanner/download/

همچنین نرم افزار آلبالو هم هست که اونم خوبه.
http://redmove.persiangig.com/MyPrograms/Albaloo%201.3.exe

mosavi7
سه شنبه 15 اسفند 1391, 13:28 عصر
این رو توی 1 فایل که همه جا اینکلود میشه ( مثلا config.php ) بنویسید:



function safe( $key, &$value ) {
$value = trim( $value );
$value = stripslashes( $value );
$value = mysql_real_escape_string( $value );
}
array_walk_recursive( $_POST, 'safe' );
array_walk_recursive( $_GET, 'safe' );


با تشکر از شما که به سوال ابتدای بنده پاسخ دادید ...
فقط امیر اقا من قبلا یه از یه فانکشن استفاده میکردم , که باید به صورت دستی بر روی همه ورودی ها ست بشه :

function sanitizeString($var)
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}
حالا میشه این فانکشن رو هم به صورت اتوماتیک در فایل فانکشنم قرار بدم که دیگه نیازی نباشه بر روی همه ورودی ها ست بشه !؟؟

AbiriAmir
سه شنبه 15 اسفند 1391, 14:59 عصر
بله میشه


function safe( &$value, $key ) {
$value = trim( $value );
$value = strip_tags( $value );
$value = htmlentities( $value, ENT_COMPAT, 'UTF-8' );
$value = stripslashes( $value );
$value = mysql_real_escape_string( $value );
}
array_walk_recursive( $_POST, 'safe' );
array_walk_recursive( $_GET, 'safe' );


trim رو هم خود بنده اضاف کردم در بسیاری موارد خوب هست
مثلا خیلی ها عادت دارند آخر نام کاربری یا پسورد خود اسپیس میزنند
اما این کد ممکنه فقط 1 جا برای شما مشکل ساز بشه
اون هم استفاده از اون توی بخش مدیریت هست (یا به طور کلی هر جا که لازم باشه کد html وارد بشه)
مثلا با این کد اگر مدیر در ادیتور متنی را وارد کند به طور خودکار تگ های html آن هم پاک میشود
برای این که تاپیک کامل بشه راه حل اون رو هم عرض میکنم:



function safe( &$value, $key ) {
$value = trim( $value );
if( strpos( $key, 'text' ) !== false ) {
$value = strip_tags( $value );
$value = htmlentities( $value, ENT_COMPAT, 'UTF-8' );
}
$value = stripslashes( $value );
$value = mysql_real_escape_string( $value );
}
array_walk_recursive( $_POST, 'safe' );
array_walk_recursive( $_GET, 'safe' );


این کد کارش اینه که اولا همه ورودی ها رو از نظر امنیتی چک میکنه
ثانیا چک میکنه اگر در اسم فیلد کلمه text وجود داشت اونوقت دستور strip_tags و htmlentities رو اجرا نمیکنه (این برای جاهایی خوبه که کد html هم میتونه وارد بشه)
بنابراین با استفاده از این کد کافیه که شما توی کل سیستمتون هرجایی ورود کد html مجاز بود در اسم فیلد کلمه text رو هم بکار ببرید و جاهایی که html مجاز نیست هم به هیچ وجه کلمه text رو در اسم فیلدتون بکار نبرید که باعث حمله xss نشه
با این کد به راحتی میتونید جلوی حملات sql injection و xss رو بگیرید ;)

imanitc
چهارشنبه 16 اسفند 1391, 11:24 صبح
من قبلا از اين تابع استفاده کردم ميخاستم ببينم ميشه اين تابع رو بجاي اين تابع safe بکار برد


function replace($str) {
$str=str_replace("ی","ي","$str");
$str=str_replace("ک","ك","$str");
$str=trim(mysql_real_escape_string(htmlspecialchar s($str)));
return $str;
}

AbiriAmir
چهارشنبه 16 اسفند 1391, 19:29 عصر
بله دوست عزیز عرض کردم که
اصلا فرقی نمیکنه شما از چه تابعی استفاده میکنید...
فقط پارامتر اول باید به صورت reference باشه که تغییرات توی خود آرایه ایجاد بشه



function replace($str) {
$str=str_replace("ی","ي","$str");
$str=str_replace("ک","ك","$str");
$str=trim(mysql_real_escape_string(htmlspecialchar s($str)));
return $str;
}
function myReplace( &$value, $key ) {
$value = replace( $value );
}

array_walk_recursive( $_POST, 'myReplace' );
array_walk_recursive( $_GET, 'myReplace' );