SQL Injection چیست؟

برای شروع بد نیست بدانیم SQL Injection چیست و یک مثال ساده ی آن را بررسی کنیم.

SQL Injection عبارتست از وارد کردن اطلاعات مخرب در ساختار دستورات SQL که ممکن است باعث آسیب جدی به ساختار و اطلاعات پایگاه داده ی برنامه شود.

SQL Injection

 رویکرد ما در بررسی SQL Injection بررسی کدهای نوشته شده به زبان php است و به همین خاطر مثال ها و راهکارهای ارائه شده همگی منطبق با زبان php می باشند. با این وجود می توان گفت مثال ها خیلی متکی به زبان نیستند و با اندکی تغییر قابل تعمیم به هر زبان برنامه نویسی دیگری که به نوعی با پایگاه های داده از خانواده ی SQL در ارتباط است می باشد.

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

...
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username'
AND password = '$password'";
...

کد بالا یک مثال ساده با امنیت بسیار ضعیف است و ممکن است به نظر غیر ممکن برسد که کسی از چنین کدی استفاده کند. با این وجود یک جستجوی ساده در گوگل انبوهی از سایت ها و برنامه های کاربردی تحت وب را نشان می دهد که همگی به همین سادگی در معرض  خطر جدی حملات SQL Injection قرار دارند.

کد بالا نام کاربری و رمز عبور را از ورودی گرفته و بعد از بررسی در صورتی که کاربری در پایگاه داده یا این نام کاربری و رمز عبور وجود داشته باشد به کاربر اجازه ی ورود می دهد. فرض کنیم نام کاربری ما omidreza و رمز عبور ۱۲۳۴۵ باشد. در این صورت اگر کاربر نام کاربری و رمز عبور را درست وارد کرده باشد دستور SQL ما به شکل زیر خواهد بود.

SELECT * FROM users WHERE username='omidreza' AND password = '12345'

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

' or '1'='1

را وارد کند. در اینصورت دستور SQLای که روی پایگاه داده اجرا می شود به شکل زیر خواهد بود.

SELECT * FROM users WHERE username='' or '1'='1' AND password = '' or '1'='1'

عبارتی که در کد بالا inject شده است باعث می شود شرط مورد بررسی در دستور SQL همواره درست باشد و  متاسفانه فارغ از اینکه نام کاربری و رمز عبور درست چه باشد کد بالا بعد از اجرا به کاربر اجازه ی عبور و دسترسی به سیستم مدیریت را خواهد داد.

در مثال بالا برنامه از متد POST برای تبادل اطلاعات با کاربر استفاده می کند. اگر متد مورد استفاده GET باشد هم همین مشکل وجود دارد. به مثال زیر توجه کنید:

http://www.omidr.com/view_post.php?id=256

در مثال بالا آدرس صفحه صفحه ای را می بینیم که بناست با استفاده از متد GET درخواست نمایش یک نوشته از سایت را برای برنامه ارسال کند. متاسفانه url در این روش به سادگی قابل دستکاری بوده و کاربر می تواند آن را به شکل زیر درآورد.

http://www.omidr.com/view_post.php?id=256‘; DROP TABLE users;

با فشردن کلید enter نوشته ی دارای id برابر ۲۵۶ به نمایش در خواهد آمد ولی جدول users هم از پایگاه داده ی سایت پاک خواهد شد. البته بدیهی است در چنین شرایطی هکر به پاک کردن یک جدول بسنده نکرده و تا جایی که بتواند به سیستم ضربه وارد خواهد کرد و به همین سادگی ممکن است زحمات چند ساله ی یک گروه چندین نفره با یک سهل انگاری از بین برود.

قسمت بعدی این سری به معرفی راهکارهایی ساده ولی راهگشا برای رفع چنین حفره های امنیتی خواهد پرداخت.

3 پاسخ به “SQL Injection چیست؟”

  1. ایول
    مطالب سایتت عالی هستند. از ادبیهاش گرفته تا کامپیوتری هاش.

  2. sedigh گفت:

    من که تازه دارم در مورد SQL Injection اطلاعات کسب می کنم. ولی از مطلبی که گذاشتین ممنونم. به دردم خورد.
    میشه یه خلاصه ای از کاربرد Jquery – ajax – javascript برام میل کنید ؟؟؟ یا بذارین تو وبلاگتون

    • امیدرضا گفت:

      با سلام خدمت شما
      متاسفانه این چند روزه به شدت گرفتارم ولی حتما در آینده ی نزدیک مطلبی در این باره تهیه خواهم کرد.

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

نشانی ایمیل شما منتشر نخواهد شد.