انجمن‌های فارس وب

نسخه کامل: SQL Injection Defence
شما در حال بازدید از بایگانی ارسال های انجمن هستید این نسخه کامل نیست : برای مشاهده نسخه کامل اینجا کلیک کنید
درود
با عرض تشکر و معزت خواهی ویژه از مدیر محتم سایت ب دلیل کم  کاری در این مدت. البته این کم کاری من هم به دلیل کنکور بود و هم به دلیل اینکه مشغول تالیف کتاب بودم و هستم.اکنون هم قسمتی از کتاب را تحت عنوان " ایمن سازی اسکریپت ها در براربر حملات تزریق کدهای SQL " است را میگزارم. ( البته در کتاب کامل تر است ).
-------------------------------
برای جلوگیری از اینگونه حملات ، چندین راه در پیش دارید. اولین راه قرار دادن 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(12345);
$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

پایان
-------------
اگر دوستان در مورد این حملات اطلاعی ندارند ، بفرمایند تا توضیحاتی را عرضه کنم. با تشکر شهریار جلایری

اول از همه مي بايست عرض كنم كه جنابعالي يكي از كاربران و مديران ارزشمند ما هستيد و وجود اعضائي همانند شما براي جامعه ي ما غنيمته . اهميت مطالب در كيفيت هستش ؛ نه كميت ؛ كه خوشبختانه تا به حال مطالب شما داراي چنين فاكتوري بوده اند .

مراقبت از اشتباهات غير عمدي متغير ها در كوكي ها و فرم ها و آدرسها و تعامل اون با دستورات بانك اطلاعاتي يكي از واجبات امنيت هستش كه بخشي از اونها با استفاده از توابعي چون ()addslashes و ()mysql_escape_string قابل انجام هستن .

به طور پيش فرض در پيكربندي php.ini مقدار magic quotes برابر On هستش كه به طور خودكار كاراكتر هاي ويژه به قول شما *يلتر مي شن كه با فراخواني تابع ()get_magic_quotes_gpc و حصول مقدار true يا fasle مي شه به فعال يا غير فعال بودن اين قابليت پي برد و به نظرم بهتره كه از تابع ()addslashes براي عدم تغيير در ساختار Database Query استفاده كرد .

به نظر مياد اين مقاله بيشتر به امنيت و مقابله با هك مربوط باشه ؛ بهتره كه به اون بخش انتقال داده بشه .
موفق باشيد .
بد نيست ، با اجازه ي شما البته ، براي تكميل به مثالي اشاره كنم كه دوستان بهتر با فاجعه اي كه ممكنه رخ بده آشنا بشن ، فرض كنيم دوستي از نام كاربري khodam',admin='1 استفاده كنه ، اگه بدون *يلتر كاراكتر ها وارد كوئري بشن چه اتفاقي مي افته ؟

UPDATE table SET Name='khodam',admin='1' WHERE ID=1


ممكنه همين جور اشتباهات با دستور DROP هم اتفاق بيافته .

فقط يك سوال ؛ ما نميتونيم معادل فارسي براي عنوان اين بحث پيدا كنيم كه به اون هم اشاره اي بشه؟

Etra نوشته است:
بد نيست ، با اجازه ي شما البته ، براي تكميل به مثالي اشاره كنم كه دوستان بهتر با فاجعه اي كه ممكنه رخ بده آشنا بشن ، فرض كنيم دوستي از نام كاربري khodam',admin='1 استفاده كنه ، اگه بدون *يلتر كاراكتر ها وارد كوئري بشن چه اتفاقي مي افته ؟

UPDATE table SET Name='khodam',admin='1' WHERE ID=1


ممكنه همين جور اشتباهات با دستور DROP هم اتفاق بيافته .

فقط يك سوال ؛ ما نميتونيم معادل فارسي براي عنوان اين بحث پيدا كنيم كه به اون هم اشاره اي بشه؟

منظورتون از عنوان فارسی چی هست؟ عنوان فاسی میتونه "ره های دفاع در برابر حملا ت تزریق کدهای SQL" باشه ، البته یک طولانیه ...

مرجع آدرس ها