آموزش حفاظت از وب سایت در برابر حملات هكينگ با روش SQL Injection

 

ما به عنوان یک توسعه دهنده وب باید اطلاعات کامل و بروز شده ای از هرآنچه که امنیت یک وب سایت را تهدید میکند داشته باشيم. از آنجایی که بارها با روش های گوناگون وبسایت هایی را هک و دیفیس کرديم با متدولوژی هک سایت و تکنیک های مختلف آن آشنا هستيم لذا وقتی راههای نفوذ را مبشناسيم پس راههای جلوگیری از هک شدن را هم میدانيم! کماکه یک هکر خوب می تواند یک مدیر امنیتی بسیار عالی باشد.
یکی از مخوف ترین و کاربردی ترین روش های هک وبسایت تزریق کد به دیتابیس است، درواقع هکر با شناسایی باگ های موجود در دیتابیس سایت و اسکن ساختار آن اقدام به تزریق کد هایی میکند که منجر به گرفتن دسترسی کامل کنترل سایت، تغییر و از بین بردن کامل اطلاعات آن شود.
(
ابتدا لازم میدانم تذکر اکید بدهم اگر با مباحث برنامه نویسی و تخصصی این حوزه آشنایی کافی ندارید همین حالا از مطالعه این آموزش دست کشیده و هنگامی که دراین زمینه متبحر شدید بازگردید!)
اگر مشتاق هستید تا با بررسی موشکافانه سناریوی کامل هک سایت با تکنیک های تزریق کدهای اس کیو ال ، علاوه بر آشنایی با این روش راههای مقابله با آن را بیاموزید به جای بسیار خوب و مناسبی قدم گذاشته اید چراکه اینجا میخواهیم یک مقاله تقریباً مفصل در این زمینه داشته باشیم پس با من همراه باشید:
SQL Injection
چیست و چگونه کار میکند؟
وب سایت های دینامیک مختلف بزرگ و کوچکی در سراسر وب موجود هستند که با زبان ها و ساختارهای مختلف و استاندارد تولید و مدیریت شده اند. بحث این مقاله متمرکز بر وبسایت های تولید شده به زبان PHP است و از جزئیات روش های مختلف اینکار فاکتور گرفته به تشریح اصول و قواعد آن میپردازیم.
می دانیم وب سایت های پویا ، جهت تعامل با کاربران و بازدیدکنندگان و ارائه خدمات مختلف به آنها نیازمند داشتن یک بانک اطلاعاتی چندمنظوره هستند که همین database از مهمترین ارکان یک وبسایت است لذا میتواند دریچه ای بسمت شکستن امنیت سایت و هک آن را برای هکر باز کند. بهمین دلیل یک از آیتم های پررنگی که ذهن یک هکر حرفه ای را برای هک یک وب سایت درگیر میکند همین گزینه است.
با اینکه من در مثالهایم زبان برنامه نویسی سایت را PHP درنظر گرفتم ولی این قواعد و راه حل ها اصولی ملی هستند که در زبانهای تحت وب دیگر هم مصداق دارند



 


 

بیایید کار را با یک مثال شروع کنیم. فرض کنیم شما در سایت شرکت خود یک دیتابیس دارید که حاوی جداول و کوئری های خاصی بوده تا با مشتریان شما تعامل داشته باشند. و شما حتی در سفر براحتی آنلاین شده و اقدام به مدیریت کاربران و مشتریان خود میکنید. شکل گیری دیتابیس شما در فرم ورود کاربران چیزی شبیه به این است:

 


Top of Form

$q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' ";
?>

Bottom of Form


 

هکری وارد سایت شما شده و به منظور آزمایش (آزمون خطا اغلب مطمئن ترین راه است!) کد زير در بخش نام کاربری وارد میکند:

 


Top of Form

' ; SHOW TABLES;

Bottom of Form


 

درحالت عادی ( اگر اقدامات امنیتی لحاظ نشده باشد) جداول پایگاه داده شما را مشاهده خواهد کرد! و از آنجا که او نام جداول را میداند ، این کد را وارد میکند:

 


Top of Form

'; DROP TABLE [your table's name];

Bottom of Form


 

your table’s nameنام تیبل مذکور است. حالا تمام اطلاعات از بین خواهند رفت..
*
نکته: توجه کنید این مثال در بدبینانه ترین حالت ممکن روی میدهد و درحال حاضر وبسایتی را نمیابید که اینگونه و به این راحتی در دست شما قرار بگیرد! اینجا مثالی زده شد تا مفهوم اس کیو ال اینجکشن را ملموس تر دریابید. گاهاً یک هکر وقت زیادی را صرف آنالیز دیتابیس شما میکند.
مرحله اول: استفاده از mysql_real_escape_string()
این تابع PHP با گریز از فرار از کاراکترهای خاص استفاده شده در SQL Query از حمله جلوگیری میکند:

 


Top of Form

$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ";
?>

Bottom of Form


 

مرحله ۲:

استفاده از mysql_query()
با استفاده ازاین کد (یا تابعی شبیه به این) به هکر اجازه استفاده از رشته های خاص در فیلد “نام کاربری” را نمیدهید.

 


Top of Form

//connection
$database = mysql_connect("localhost", "username","password");
//db selection
mysql_select_db("database", $database);
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);
?>

Bottom of Form


 

توصیه مهم:

کانکشن ها را متمرکز کنید.. تابع ‘include()’ فقط هنگام اتصال به دیتابیس اصلی استفاده شود. بگذارید خیالتان را راحت کنم! یک صفحه با نام ‘connections.php’ ایجاد کنید و کدهای زیر را در آن بریزید:

 


Top of Form

//connection
$database = mysql_connect("localhost", "username","password");
//db selection
mysql_select_db("database", $database);
?>

Bottom of Form


 

حالا باید تنظیمات جدیدی داشته باشیم تا موجب اثربخشی کدهای موجود در صفحه ای که دربالا تولید کرده ایم شویم:

 


Top of Form

include("connections.php");
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);
?>

Bottom of Form


 

توصیه مهم:

هنگام شروع صفحه اطلاعات را اصطلاحاً پاکسازی (متمایز) نمایید.
بسیاری از زبان های برنامه نویسی شما را مجبور به تعیین متغیرها قبل از شروع کد نویسی میکنند که تنها می توانید آنها را در سراسر اسکریپت استفاده کنید. ولی در PHP مجبور انجام این کار نیستید و درهرجای دلخواه از برنامه میتوانید متغیر تعریف کنید ، با این حال آن را یک عادت خوب برای متمایز کردن متغیر های تان در آغاز هر حال صفحه بدانید!
خب شاید شاید شخصی این سوال برایش بوجود بیاید وقتی میتوان در هر جای صفحه متغیر تعریف نمود چرا باید اینطور عمل کنیم؟!! در پاسخ باید گفت تفصیل فلسفه این کار بسیار عمیق بوده که در حوصله این مقاله نیست ، ولی چند نمونه از دلایل فواید اینکار را فقط نام میبرم:
باگ ها اغلب نتیجه بی نظمی ها هستند؛
با تمایز متغیرها می توان آزادانه در سراسر خطوط برنامه نویسی از آنها استفاده کرد؛
این کار موجب جلوگیری از بسیاری از اشتباهات چه دستوری و چه الگوریتمی می گردد.
اگر در ابتدای صفحه متغیر تمیز داده شده باشد چیزی شبیه به این داریم:

 


Top of Form

include("connections.php");
$username = mysql_real_escape_string( $_GET['username'] );
$password = mysql_real_escape_string( $_GET['password'] );
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database);
?>

Bottom of Form

 

یا به این مثال دقت کنید:

 

Top of Form

function cleaner($input){
//clean variable, including mysql_real_escape_string()
}
include("connections.php");
$username = cleaner( $_GET['username'] );
$password = cleaner( $_GET['password'] );
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database);
?>

Bottom of Form


 

پیشنهاد:

پس از کدنویسی کدهای خود را چک کنید و از همه لحاظ آن ها را مورد ارزیابی تخصصی قرار دهید. حتماً مطمئن باشید پردازش های غیر ضروری روی سرور اعمال نشود. به این کد توجه کنید:

 


Top of Form

function cleaner($input){
//clean variable, including mysql_real_escape_string()
}
include("connections.php");
$username = cleaner( $_GET['username'] );
$password = cleaner( $_GET['password'] );
//Check if the input is blank.
if( ($password == '') || ($username == '')){
//dont let them pass
}
//Check if they are putting in way too many characters than should be allowed.
else if( (strlen($username) >
۲۰) || (strlen($password)> ۲۰) ){
//dont let them pass
}
//Passed all of our checks! Run query.
else {
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .$username. " ' AND `password`= ' " .$password. " ' ", $database);
}
?>

Bottom of Form


 

 

 

 


برچسب‌ها:

تاريخ : چهارشنبه 14 بهمن 1394 | 11:22 | نویسنده : yaddashtkon | ارسال نظر(0)

.: Weblog Themes By SlideTheme :.
💬 نظرات کاربران
💬ثبت نام کاربران
💬ورود کاربران


  • سحر دانلود