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

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

amhr

تازه وارد
23/11/13
34
0
6
سلام به دوستان عزیز .

اگر شما طراح وب باشید حتما کلمه 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

کاربر عضو
17/12/12
205
0
16
ممنون از شما.

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

 

mr.na3r

کاربر عضو
17/12/12
205
0
16
ممنون از شما.

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

 

amhr

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

 

amhr

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