جلوگیری از حمله SQL Injection در PHP

ارسال شده توسط: حسین درویشی Comments: 0

جلوگیری از حمله SQL Injection در PHP

یکی از مشکلات بسیار مهم و قدیمی وجود باگ SQL Injection در پروژهای برنامه نویسی است که با دیتابیس سروکار دارند. این مشکل تا حدی است که هکر می تواند براحتی بدون هیچ زحمت اضافه به سیستم شما نفوذه کرده و آن را دچار اخلال کند. در این مقاله می خواهیم ببینم SQL Injection چیست و روش جلوگیری از حمله SQL Injection در PHP به چه شکلی می باشد.

همانطور که در ابتدای مقاله اشاره کردم SQL Injection یک باگ امنیتی بسیار قدیمی است و امروزه روش های گوناگونی برای این مشکل ارائه کرده اند.

SQL Injection یا تزریق SQL چیست؟

یکی از باگ های امنیتی موجود در کدهای برنامه نویسی است که به وسیله ارسال کاراکترهای منطقی بجای عبارت های نام کاربری و رمز عبور، در اجرای کوئری دیتابیس مشکل ایجاد می کند.

مثال در یک سیستم ورودی که این باگ امنیتی را دارد می توان عبارات زیر را بجای نام کاربری یا رمز عبور ارسال کرد.

" or ""="

با وارد کردن این عبارات و کلیک روی دکمه ورود شما خواهید توانست تا وارد سیستم قربانی شوید و سیستم آن را دچار اختلال کنید به همین راحتی. (البته اگر مشکل injection داشته باشد).

واقعاً!!؟؟

بله این مشکل اکنون در اکثر وب سایت های کشورهای دارای سطح علمی پایین تر وجود دارد و هکر که هیچ، اگر این موارد را به یک کودک هم یاد دهیم می تواند وارد سیستم شده و آن را دچار اختلال کند.

خوب چگونه می توان از این مشکل در پروژه های php جلوگیری کرد؟

جلوگیری از حمله SQL Injection در PHP

یکی از روش ها این است که موقع دریافت اطلاعات از کاربر از تابع mysql_real_escape_string استفاده کنیم. خوب اما این روش در PHP7 منسوخ شده چون تابع آن منسوخ و حذف شده است. پس از این روش استفاده نکنید.

روش دوم استفاده PDO بجای دستورات MySQLi می باشد این روش دارای امنیت دارای نسبت به سایر روش ها می باشد.

فرض کنید یک دیتابیسی با نام myDb داریم و این دیتابیس یک جدول کاربران با نام tbl_users دارد. فیلدهای نام کاربری و رمز عبور را در نظر می گیریم و به منظور تسریع در آموزش از سایر فیلدهای صرف نظر می کنیم.

باید بدین گونه نام و کاربری و رمز عبور را چک کنید:

            <?php
//دریافت نام کاربری با روش پست
$username = @$_POST['user'];
// دریافت رمزعبور با روش پست
$password = @$_POST['pass'];
try {
//اطلاعات مورد نظر برای کانکت به دیتابیس
$conn = new PDO("mysql:host=serverName;dbname=myDb", 'username', 'password');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$st = $conn->prepare("SELECT * FROM tbl_users WHERE user_email=? AND user_pass=? ");
$st->execute(array($username, $password));
//$stmt->execute();
$result = $st->fetch(PDO::FETCH_BOTH);
$res = $st->rowCount();
if (@$_POST['submit']) {
if ($st->rowCount() > 0) {
if ($_POST['member']) {
setcookie('username1', $username, time() + (86400 * 12), '/');
setcookie('password', $password, time() + (86400 * 12), '/');
}
setcookie('username', $username, time() + 3600, '/');
header("location:index.php");
} else {
echo '<div class="alert alert-danger">' . ' <strong>بروز خطا:</strong> ' . 'نام کاربری یا رمز عبور اشتباه است' . '</div>';
}
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
<br>
<label>نام کاربری</label>
<input type="text" name="user" class="form-control" value="<?php echo @$_COOKIE['username'] ?>">
<label>رمز عبور</label>
<input type="password" name="pass" class="form-control" value="<?php echo @$_COOKIE['password'] ?>">
<div class="container" style="padding-top: 20px">
<p class="text-right">مرا بخاطر بسپار <input type="checkbox" class="checkbox"
value="مرا بخاطر بسپار" name="member"></p>
</div>
<input type="submit" name="submit" class="btn btn-primary custom-radio" value="ورود به سایت">
</div>
</div>
</form>

پس استفاده از PDO یک روش مناسب و پیچیده در امر مقابله با حمله SQL Injection در php می باشد.

برای امتیاز به این نوشته کلیک کنید!
[کل: 1 میانگین: 1]

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *