PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : SQL Injection Defence



ShahreServer
August 21st, 2010, 23:44
-------------------------------
برای جلوگیری از اینگونه حملات ، چندین راه در پیش دارید. اولین راه قرار دادن magic_quotes_gcp به صورت on است . با انجام این کار کاراکتر Apex در کوکی ها و ارسال هایی که توسط روش GET و POSTانجام میگریند ، ***** شده و از بین میروند. همانطور که دیدید ، کاراکتر Apex نقش مهمی در ایجاد یک حمله موفق تزریق کد های SQL بازی میکند و نبود آن باعث شکست حمله ما میشود.
روش دیگر استفاده از تابع addslashes() است.این تابع کاراکتر های مربوط به ارسال های پایگاه داده ها مانند ( ‘ ) و ( " ( و NUL را با یک اسلش ( / ) همراه میسازد.به طور مثال :


<?
//addslashes() Function example
//Attack and defence php apps book
//shahriyar - j
$str = "Is your name Shahriyar'j?";
echo addslashes($str);
// Outputs: Is your name Shahriyar\'j?
?>

همانطور که میبینید کاراکتر ( ‘ ) ***** شد.
راه دیگر برای در امان ماندن از این حملات استفاده از تابع Mysql_escape_string() است.این تابع نیز همانند تابع Addslashes() عمل میکند.ببینید:


<?
//mysql_escape_string() Function example
//Attack and defence php apps book
//shahriyar - j
$item = "shahriyar-j's Book";
$escaped_item = mysql_escape_string($item);
printf("Escaped string: %s\n", $escaped_item);
// Outputs: shahriyar-j\'s Book
?>

یکی دیگر از روش هایی که میتوان برای جلوگیری از این حملات به کار برد استفاده از توابعIs_numeric() و Is_int برای گرفتن شماره کاربری است.
آخرین راهی که برای جلوگیری از این حملات به ذهن من میرسد استفاده از تابع array_map() است.یکی از کاربرد هایی که این تابع به ما ارائه میدهد ، اعمال یک تابع بر روی ورودی هایی که به صورت آرایه هستند ،است.برای فهم این موضوع به مثال زیر دقت کنید:


<?
//array_map() Function Example
//Attack and defence php apps book
//shahriyar - j
<?php
function cube($n)
{
return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
?>

در کد های بالا با استفاده از تابع array_map() کاری کردیم که تابع cube با استفاده از هر یک از داد های موجود در آرایه $a اجرا شده و مقداری جدید ، ایجاد کند. نتیجه کد های بالا به صورت زیر خواهد بود.


Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125
)


اکنون میتوان از این تابع به صورت زیر برای جلوگیری از حملات تزریق کد های SQL بهره جست.


$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
$_GET = array_map('addslashes', $_GET);
$_POST = array_map('addslashes', $_POST);
$_COOKIE = array_map('addslashes', $_COOKIE);


با انجام هر یک از توابع بر روی روش ها ارسالPOST ، COOKIE و GET کاراکتر های خاصی را که برای حمله مورد نیاز هستند ، ***** کرده و حمله را ناموفق میکنیم.البته شما میتوانید با استفاده از خلاقیت خود روش های جدیدی برای جلوگیری از این حملات ایجاد نمایید.
نکته : از روش هایی که در آنها از توابع خاص استفاده شده است، تنها در صورتی استفاده کنید که مقدار magic_quotes_gpc برابر OFF باشد. برای این کار میتوانید از یک شرط ساده استفاده کنید:


if(!get_magic_quotes_gpc())
{
Filter codes
Escape codes
Filter codes
Escape codes
Filter codes
Escape codes
}


پایان

Rezash
August 22nd, 2010, 00:22
ممنون
كاش كدها رو در بلوك كد php مي ذاشتيد تا بهتر مشخص باشند
يا اينكه الان كه رنگيشون كرديد ، چپ چين كنيد
با اجازه منم يك نكته رو اضافه كنم!
موقع اتصال يك يوزر به يك ديتابيس ، اكثرا تا جايي كه ديدم فوري روي تيك all privilages كليك مي كنن و همه دسترسي ها رو به يوزر مي دند...
در واقع اين كار يك اشتباه محض ـه ! ما بايد بسته به نيازي كه داريم اختيارات رو به يك يوزر بديم.
مثلا در يك سايت كه فقط قرار هست اخبار نمايش داده بشه تنها قابليت SELECt كافيه...
چون اگه حتي ورودي ها فيلتر نشده باشند كار زيادي از دست كاربر بر نمياد...
ولي اگه ورودي ها فيلتر نشده باشند و پرميشن هاي بيشتري مثل DELETE،UPDATE,INSET,INDEX,DROP و و.... فعال باشه كاربر مي تونه اعمال مخربانه تري رو انجام بده...
از طرفي در بخش مديريت ممكنه نياز به پرميشن هاي بيشتري داشته باشيم! معمولا براي بخش مديريت سايت هاي شخصيم يك يوزر جدا در نظر مي گيريم كه اختيارات بيشتري داره و از طرفي با خود سي پنل يا ... دسترسي رو محدود تر مي كنم . اينجوري اگه حتي در كد نويسي هم مشكلاتي رو داشته باشم به راحتي قابل نفوذ نيست!

vPsPersia.COM
August 22nd, 2010, 00:44
موقع اتصال يك يوزر به يك ديتابيس ، اكثرا تا جايي كه ديدم فوري روي تيك all privilages كليك مي كنن و همه دسترسي ها رو به يوزر مي دند...

پس برای نصب اسکریپت هایی نظیر نیوک یا وی بی و .. باید چه تیک های رو بزنیم؟؟

Rezash
August 22nd, 2010, 01:11
پس برای نصب اسکریپت هایی نظیر نیوک یا وی بی و .. باید چه تیک های رو بزنیم؟؟
دقيقا نمي دونم اين سي ام اس ها چه جوري كد نويسي شدند،ممكنه در ماژول هاي خاصي نياز به همه پرميشن ها باشه.
ميتونيد تست كنيد،مثلا drop فكر نكنم بكار رفته باشه ولي اگه در injection بشه drop كرد تمام اون جدول با اطلاعاتش مي پره واين گاهي يعني فاجعه
پرميشن هايي مثل index و drop و creat تا اونجا كه به نظرم ميرسه نبايد جز در بخش پشتيبان گيري اين سي ام اس ها استفاده شده باشند(اگر شده باشند!)
كه به نظر من معقولانه تر اينه كه اين پرميشن ها داده نشه و بك آپ گيزي اگه از كار افتاد از phpmyadmin استفاده بشه
چون خيلي از اطلاعاتي كه كاربر از پايگاه داده براي نفوذ ميكشه به index هم ربط داره!اينكه چه جدوالي داريم و ...
پس اگه بسته باشه خيلي كمك مي كنه...
البته من نميگم كه دادن همه پرميشن ها هميشه يك اشتباه محضه!در واقع اين پرميشن ها از خصوصيات قابل توجهي هست كه در اختيار داريم ولي خلاصه كل حرفام اين بود كه در حد نياز اين پرميشن ها رو بذاريم...
و گرنه مثلا ممكنه در بعضي cms ها براي نصب ماژول يا حذف و اين چنين عملياتي استفاده از drop و ... امري اجتناب ناپذير باشه اما هميشه اينطور نيست
براي نمونه در مثالي زدم كه ممكنه در يك سايت فقط نياز به نمايش اخبار داشته باشيم ...