SQL injection و راه های مقابله با آن ...

  • نویسنده موضوع amhr
  • تاریخ شروع

amhr

تازه وارد
سلام به دوستان عزیز .

اگر شما طراح وب باشید حتما کلمه sql injection به گوشتان خورده است .

کلا sql injection به چه معنا است .

در زبان شیرین پارسی کلمه ی sql injection به معنای تظریق sql میباشد . بدین صورت که شما یک sql query رو وارد یک کوئری درحال execute کنید و باعث خراب کاری شوید .

اما sql injection چطور است .

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


کد:
<?php$Username = $_POST['Username'];$Password = $_POST['Password'];$SQL = "SELECT * FROM `users` WHERE `u_name` = '$Username' AND`u_pass` = '$Password'";$Rslt = mysql_query( $SQL);if( mysql_num_rows( $Rslt) > 0){print('welcome to your profile...');} else {die('The specified username and/or password is invalid!');}?>
و فکر کنید دیگه هیچ چیز نمیتونه اینو هک کنه :D اما سخت در اشتباهید چون به راحتی قابل هک است .

اما چطور .....

خوب شما در صفحه ی ورود جای نام کاربری از 'enytext استفاده کنید یعنی از یک کوتیشن

» یاد آوری :

ما در sql query ها برای دادن یک مقدار از '$varname' استفاده میکردیم مانند : "SELECT * FROM users WHERE username = '$username'"

خوب اگر این متغیر $username دارای کوتیشن باشد query ما بسته میشود خوب ما راحت میتونیم یک یوزر جعلی وارد تیبل یوزر هامون کنیم

فقط کافی است جای نام کاربری از


کد:
'; INSERT INTO users (username,password) VALUES ('myusername','mypassword')'
استفاده کنیم یا اصلا میتونیم پسورد مدیریت رو تغیر بدیم ، کلا دیگه sql دست شماست و میتونید هر query که دلتون میخواد وارد کنید .

اما برای مقابله چیکار کنیم ؟

اولین کار اینه که پسورد هارو هش کنیم که الگوریتم های زیادی هست مانند :


کد:
function hashpw($pw,$date){	$password = md5(md5($pw).$date);}
که کاره مارو راحت تر میکند

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


کد:
$Username = preg_replace("([^a-z0-9_]*)", '', $Username);
بهتره که اجازه ندید کاربراتون با حروف فارسی ثبت نام کنند.

و بعد از تابع strtolower($str) استفاده کنید تا حروف رو به حالت حروف کوچک انگلیسی درآورند .

در کوئری select پسورد هم حتما این تغیرات رو انجام بدید :


کد:
"SELECT `u_pass` FROM `users` WHERE `u_name` = '$Username'LIMIT 0,1";
تا هم بیشتر از بک ریکورد بر نگردونه و بعدا چون پسورد رو دریافت کردیم میتونیم با پسورد وارد شده چکش کنیم .

امید وارم از این آموزش خوشتون آمده باشه .

منبع :

 

mr.na3r

کاربر عضو
ممنون از شما.

به جای کوئری میشه از pdo هم استفاده کرد که امنیت بیشتری داره.

 

mr.na3r

کاربر عضو
ممنون از شما.

به جای کوئری میشه از pdo هم استفاده کرد که امنیت بیشتری داره.

 

amhr

تازه وارد
درست میگید ، تازه php اعلام کرده در ورژن های بعدی توابع mysql_ رو حذف خواهد کرد و به جای آن میتوان از mysqli یا pdo استفاده کرد

 

amhr

تازه وارد
درست میگید ، تازه php اعلام کرده در ورژن های بعدی توابع mysql_ رو حذف خواهد کرد و به جای آن میتوان از mysqli یا pdo استفاده کرد

 
بالا