حمله sql injection

بهترین راه کارها برای جلوگیری از آسیب پذیری تزریق PHP] SQL]

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است 

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

هکرها یا نفوذگران غیر مجاز از رمزگذاری نادرست برنامه های وب شما استفاده می کنند تا دستورات SQL را به فرم ورود به سیستم تزریق کنند. این فرآیند به آنها اجازه دهد به داده های موجود در پایگاه داده دسترسی پیدا کنند. در اصل ، دلیل به وجود آمدن تزریق SQL یا SQL Injection زمینه های موجود برای ورودی کاربر است که اجازه می دهد دستورات SQL مستقیماً از پایگاه داده پرس و جو کند.

فایروال ها و مکانیسم های تشخیص نفوذ مشابه ، در برابر حملات تزریق SQL در وب کارآیی کمی دارند. از آنجا که وب سایت شما باید عمومی باشد ، سازوکارهای امنیتی به ترافیک عمومی وب اجازه می دهند تا با برنامه های وب شما (عموماً از طریق پورت ۸۰/۴۴۳) ارتباط برقرار کنند. برنامه وب برای بازگشت (به روزرسانی) اطلاعات درخواست شده (تغییر یافته) به پایگاه داده دسترسی باز دارد.

در حملات تزریق SQL یا SQL Injection ، هکر از کوئری های SQL و خلاقیت فردی و دانش تخصصی خود استفاده می کند تا از طریق برنامه وب به پایگاه داده داده های حساس و مهم برسد.

در مثال زیر کد ورود به سیستم که در برابر SQL Injection آسیب پذیر است ، آمده است:

<html>
<head>
<title>Login</title>
</head>
<body>
<?php
if(!isset($_POST[‘submit’]))
{
$msg = “”;
form();
}
else
{
$username = $_POST[‘username’];
$password = $_POST[‘password’];

$conn = mysqli_connect(“localhost”,”root”,””,”yeahhub”) or die(“Error”. mysqli_error($conn));
$query = “SELECT user,pass FROM login WHERE username=’$username’ AND password=’$password'”;
$result = mysqli_query($conn,$query) or die (mysqli_error());
$count = mysqli_num_rows($result);

if($count == 1)
{
$msg = “Valid login credentials!”;
form();
}
else
{
$msg = “Invalid login credentials!”;
form();
}

mysqli_close($conn);
}
?>
</body>
</html>
<?php
function form()
{
$msg = “”;
echo ”
<form method=’POST’ name=’login’>

<table>
<tr><td>Username</td><td><input type=’text’ name=’username’ /></td></tr>
<tr><td>Password</td><td><input type=’password’ name=’password’ /></td></tr>
<tr><td colspan=’۲′ align=’center’><input type=’submit’ name=’submit’ value=’Login’/></td></tr>
</table>

</form>
“.$GLOBALS[‘msg’];
}
?>

کد بالا فاقد فیلتر است. بنابراین مستقیماً ورودی را از فرم گرفته و آن را در برابر پایگاه داده تأیید می کند که به آسیب پذیری SQL Injection یا تزریق SQL منجر می شود.

در ادامه این مقاله سعی کردم بهترین روش های پیشگیری از حملات تزریق SQL را بیان کنم تا از طریق آنها  بتوانید به راحتی جلوی برنامه وب خود را از این نوع حملات مبتنی بر تزریق بگیرید:

Prepared Statements

آسانترین روش برای جلوگیری از حملات SQL Injection در PHP استفاده از “Prepared Statements“ است. بنابراین ، چگونه می توانیم از عبارات statement ها برای پرس و جو در پایگاه داده فوق استفاده کنیم.

در اینجا نحوه استفاده از statement های آماده شده آورده شده است.

<?php
$username = $_POST[“username”];
$password = $_POST[“password”];
$stmt = $mysqli->prepare(“SELECT FROM login WHERE username=? AND password=?”);
$stmt->mysqli_bind_param(“ss”,$username,$password);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>

نکته مهم در اینجا این است که مقادیر پارامتر با عبارت کامپایل شده ترکیب می شوند ، نه یک رشته SQL.

بنابراین ارسال SQL واقعی به طور جداگانه از پارامترها صورت می گیرد و با این عمل مخاطرات تزریق را محدود می کنید. هر پارامتری که هنگام استفاده از یک statement ارسال می کنید فقط به عنوان یک رشته تلقی می شود (اگرچه موتور پایگاه داده ممکن است بهینه‌سازی را انجام دهد ، بنابراین پارامترها ممکن است به عنوان اعداد در نظر گرفته شوند).

اگر از WordPress استفاده می کنید ، می توانید از عبارت wpdb::prepare استفاده کنید که درست مثل statement می باشد و پرس و جو هایی که به پایگاه داده ارسال می شوند را sanitize می کند. این امر به ویژه در صورتی که از پرس و جو با ورودی کاربر استفاده می کنید دارای اهمیت زیادی است. با استفاده از چنین توابعی می توانید از هک سایتهای وردپرس از طریق پرس و جو های نادرست برنامه ریزی شده در افزونه یا قالب جلوگیری کنید.

Escaping Strings

این فرآیند به حذف کاراکترهای ویژه برای استفاده در عبارت SQL کمک می کند. همچنین charset فعلی اتصال را در نظر می گیرد.

به عنوان مثال ، می توانید از کدی مانند این استفاده کنید:

<?php
$username = mysqli_real_escape_string($conn,$_POST[“username”]);
$password = mysqli_real_escape_string($conn,$_POST[“password”]);
mysqli_close($conn);
?>

استفاده از  ()trim و  ()strip_tags

()trim و ()strip_tags روشهای مرسوم برای فیلتر کردن ورودی شما هستند.
()trim برای از بین بردن white spaces از ابتدا و انتهای یک رشته استفاده می شود 

()strip_tags برای از بین بردن برچسب های HTML و PHP استفاده می شود.

هر دوی آنها در کنار هم می توانند به از بین بردن کدها و فضاهای اضافی که معمولاً توسط هکرها استفاده می شود ، کمک کنند.

به نمونه کدهای زیر توجه کنید:

<?php
$username = strip_tags(trim($_POST[“username”]));
$password = strip_tags(trim($_POST[“password”]))
?>

استفاده از PDO

PDO یا PHP Data Objects روش های بسیار مفیدی هستند. معمولا این فرآیندها مؤثرترین روش در جلوگیری از حملات تزریق SQL است. PDO  از عبارات تهیه شده استفاده می کند و مقادیر را در زمان اجرا پیوند می دهد. در مقاله بعدی آموزش بیشتری در مورد PDO ارائه خواهم کرد.

برای PDO ، می توانید کدی مانند این داشته باشید:

$stmt = db::con()->prepare(“SELECT * FROM table WHERE id=? AND name=?”);
$stmt->bindValue(1, $id, PDO::PARAM_INT);
$stmt->bindValue(2, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

برای اتصال چندین پارامتر ، می توانید از متغیرهایی با نام به جای “؟” استفاده کنید : column_name

در اینجا چگونگی چنین کدی آورده شده است:

$stmt = db::con()->prepare(“SELECT * FROM table WHERE id=:id AND name=:name”);
$stmt->bindValue(‘:id’, $id, PDO::PARAM_INT);
$stmt->bindValue(‘:name’, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

تأثیر تزریق SQL
هنگامی که یک مهاجم متوجه شود که یک سیستم در برابر SQL Injection آسیب پذیر است ، می تواند از طریق فیلد فرم ورودی ، SQL Query / Commands را تزریق کند. این فرآیند معادل دستیابی حمله کننده به پایگاه داده شما و اجازه دادن به وی برای اجرای هر دستور SQL از جمله DROP TABLE به دیتابیس است!

یک مهاجم ممکن است دستورات دلخواه خود را بر روی سیستم آسیب پذیر اجرا کند و یکپارچگی بانک اطلاعاتی شما را به خطر اندازد و یا اطلاعات حساس را افشا کند. بسته به دیتابیس back-end مورد استفاده ، آسیب پذیری های تزریق SQL منجر به سطوح مختلف دسترسی به داده ها و یا سیستم برای مهاجم می شود.

در برخی موارد ممکن است خواندن یا نوشتن پرونده ها یا اجرای دستورات shell در سیستم عامل اصلی امکان پذیر باشد. برخی سرورهای SQL مانند Microsoft SQL Server شامل مراحل ذخیره شده و طولانی (توابع سرور پایگاه داده) هستند. اگر یک مهاجم بتواند به این رویه ها دسترسی پیدا کند بسیار فاجعه بار خواهد بود.

تهیه کننده : سید محمد اسماعیلی

 

 

نوشته های مرتبط

مدیریت پایگاه داده

۱۵

آذر
همه موضوعات

ابزار OmniDB نسخه v2.17.0 ابزاری تحت وب برای مدیریت پایگاه داده

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است ابزار OmniDB ابزاری تحت وب است که مدیریت بانک اطلاعاتی-DataBase ( دیتابیس ) را با تمرکز بر تعامل، ساده بودن، پرقدرت و سبک انجام می دهد. برخی خصوصیات این ابزار را بررسی می کنیم: ابزار وب: با استفاده از یک مرورگر تحت وب به عنوان […]

مدیریت دستگاه های IOT

۰۵

آبان
همه موضوعات

مدیریت از راه دور دستگاه های IOT با استفاده از ابزار Upswift

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است اگر فقط از یک دستگاه IoT استفاده می کنید و درحال توسعه پروژه های خود هستید، به روزرسانی و مدیریت آن سریع و آسان است. اما اگر ۱۰ ، ۵۰ یا ۱۰۰ دستگاه داشته باشید چه می کنید؟ مدیریت همه آنها ناگهان به یک دردسر[…]