بانکهای اطلاعاتی معمولا قلب یک وب سایت یا یک برنامه Web based و یا Web Enabled را تشکیل میدهند. زیرا اطلاعاتی که باید در سایت نمایش داده شوند در آنها ذخیره میگردد. بر اساس مدلهای مختلف برنامه سازی، ترکیبی از یک بانک اطلاعاتی و یک زبان اسکریپت یا کد نویسی و احتمالا چند لایه دیگر میتوان برنامه ای نوشت که مورد رضایت مشتری قرارگیرد و اورا قانع به پرداخت هزینه های برنامه نویسی نمود.
گاه با اینکه تمام جوانب برنامه نویسی را رعایت کرده ایم ممکن است متوجه وجود برخی حفره ها و یا خطاها در برنامه های خود شویم. در صورتی که این حفره ها به دلیل اشکالات موجود در ابزارهای استفاده شده در برنامه ما، مانند بانکهای اطلاعاتی باشند، میتوان به نصب SERVICE PACK ها و یا ارتقاء به نگارش جدید این برنامه ها مشکل را حل نمود، اما در اکثر موارد اشکال و حفره های موجود در یک برنامه وبی به اشکالات مربوط به “تزریق کدهای SQL” یا همان SQL Injection مربوط میشود….
SQL Injection به چه کاری میگویند؟!
همان طور که میدانید زبان SQL شامل دستوراتی است که انجام عملیات بر روی داده های یک بانک اطلاعاتی را فراهم مینماید. هر عملیات (Query) بر روی بانک اطلاعاتی میتواند شامل چندین دستور (Command) باشد. معمول ترین این دستورات عبارتند از: Select, Insert, Update و Delete.
در صورتی که فردی بتواند بصورت غیر مجاز بر روی بانک اطلاعاتی ما با استفاده از این دستورات به اطلاعاتی دست پیدا کند یا اطلاعاتی وارد سایت نماید یا آنها را تغییر داده و یا احتمالا حذف نماید و این عمل را با استفاده از ضعف ما در تفکیک مقادیر ورودی های کاربر و دستورات SQL انجام دهد، اصطلاحا به این روش غیر مجاز اجرای دستورات SQL Injection Attack میگویند.
مثالی از SQL Injection Attacks
مثالها و ضعف های مختلفی را میتوان برای یک SQL Injection Attack بیان نمود، اما در اینجا به یک نمونه ساده از نحوه عبور از یک فرم مخصوص اعتبار سنجی کاربران که به خوبی طراحی نشده آورده میشود.
معمولا برای ورود به یک سایت از طریق یک فرم کلمه عبور و نام کاربری خواسته شده و مقادیر وارد شده در صفحه دیگری ارزیابی شده و در صورت صحت اعتبار، کاربر به صفحه اصلی انتقال داده میشود. صفحه ورود اعتبار کدی مانند مثال زیر دارد:
<form name=”frmLogin” action=”login.asp” method=”post”>
Username: <input type=”text” name=”userName”>
Password: <input type=”text” name=”password”>
<input type=”submit”>
</form>
اطلاعات فرم بالا پس از Submit به صفحه Login.asp ارسال شده و با کدی مانند آنچه در زیر آمده است مورد ارزیابی قرار میگیرد:
<%
dim userName, password, query
dim conn, rS
userName = Request.Form(”userName”)
password = Request.Form(”password”)
set conn = server.createObject(”ADODB.Connection”)
set rs = server.createObject(”ADODB.Recordset”)
query = “select * from users where userName=’” &
userName & “‘ and userPass=’” & password & “‘”
conn.Open “Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; Password=”
rs.activeConnection = conn
rs.open query
if not rs.eof then
response.write “Logged In”
else
response.write “Bad Credentials”
end if
%>
در مثال بالا در صورتی که Username و Password وارد شده حداقل یک بار در بانک اطلاعاتی وجود داشته باشند، کاربر جمله “Logged In” و در غیر این صورت عبارت “Bad Credentials” را مشاهده خواهد نمود.
حال فرض کنید کاربر بجای وارد نمودن Username و Password خود عبارتهای زیر را تایپ نماید:
Username: ‘ or True –
Password: [Null]
در اینصورت دستور اجرا شده SQL ما بر روی بانک اطلاعاتی بصورت زیر خواهد بود:
select * from users where userName=” or True -– ‘ and userPass=”
همان طور که ملاحظه میشود در صورت اجرای این کد بر روی بانک اطلاعاتی، همیشه کاربر قادر به ورود به سایت بوده و جمله “Logged In” را مشاهده مینماید! ماجرا همیشه به این سادگی نیست، کاربران غیر مجاز نه تنها از طریق فرمها، بلکه از طریق تغییر Query String های صفحات وبی و یا مقداردهی بهCookie ها نیز قادر به ارسال دستورات مخرب SQL به بانکهای اطلاعاتی میباشند! و گاه میتوانند اطلاعات ما را کاملا حذف نمایند، تغییر دهند، دیتای جدید وارد کنند و یا اطلاعات ما را مشاهده و دریافت نمایند.
بنابر این: همواره مراقب اجرای کدهای مخرب که از طریق کاربر به عنوان اطلاعات معمولی به سیستم تزریق میگردند باشید!
برخی پیشنهادات برای جلوگیری و مقابله با SQL Injection Attacks:
اگر ما به عنوان برنامه نویس وب، برنامه های خود را با دقت بیشتری بنویسیم، در اکثر مواقع میتوانیم جلوی حملات SQL Injection را بگیریم، معمولی ترین راه های مقابله با این نوع حملات میتواند شامل موارد زیر باشد:
۱- محدود کردن سطح دسترسی کاربری که با آن اطلاعات وب را برای کاربر از بانک اطلاعاتی استخراج مینماید، بدین منظور بهتر است به چنین نام کاربری، تنها سطح دسترسی SELECT و INSERT برای جداولی که به چنین سطح اجرای دستوراتی نیاز دارند داده شود.
۲- با استفاده از دستور Replace مقادیر مربوط به کوتیشن ‘ را پیش از ارسال مقادیر دریافت شده از طرف کاربر بر روی سرور، از جملات مربوطه حذف نماییم.
۳- کلمات کلیدی و معنادار برای SQL مانند: Drop, Delete, Update و – را از ورودی های دریافت شده از کاربر حذف نماییم.
۴- طول پارامتر ورودی توسط کاربر را محدود نماییم.
academist.ir