SQL Injection

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

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

abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 @.-_+

توجه نمایید که فیلتر کردن ورودی تنها به معنی “حذف کاراکتر نقل قول Quotes” نمی باشد به دلیل اینکه حتی کاراکتر های منظم (Regular) نیز مشکل ساز خواهد شد. برای مثال وقتی که مقدار یک ID با ورودی کاربر مقایسه می گردد می توان SQLی در ورودی تزریق کرد که جواب عبارت همواره درست باشد

SELECT fieldlist FROM table WHERE id = 23 OR 1=1; — Always True

 استفاده از پارامتر های محدود (Prepare Statement)
همانطور که می دانید Bound parameters و یا پارامتر های محدود در تمامی زبانهای بانک اطلاعاتی مورد استفاده قرار می گیرد. در این تکنیک یک رشته SQL توسط متغیرها (Placeholders) ایجاد می شوند – توسط یک علامت سئوال – و در فرم مرتبط کامپایل می گردند و در ادامه توسط لیستی از پارامتر ها اجرا می شوند.

برای مثال در Perl
$sth = $dbh->prepare(“SELECT email, userid FROM members WHERE email = ?;”); $sth->execute($email); –TRUE

و همچنین در جاوا که عبارت زیر نا امن بوده
Statement s = connection.createStatement(); ResultSet rs = s.executeQuery(“SELECT email FROM member WHERE name = ” + formField); — FALSE

و عبارت اصلاح شده و امن آن شبیه عبارت زیر است
PreparedStatement ps = connection.prepareStatement( “SELECT email FROM member WHERE name = ?”); ps.setString(1, formField); ResultSet rs = ps.executeQuery(); –TRUE

که در این عبارت email از فرم کاربری آورده شده است و در پارامتر #1 جای می گیرد و به هیچ عنوان، کاراکتر خاصی همانند Quotes, semicolon, backslashes و .. بجز داده بر روی این عبارت تاثیر پذیر نیست. به همبن دلیل عبارت فوق عبارتی امن از نظر تزریق SQL نامیده می شود.

از دیگر ایمن سازی های وب سایت:

– کاهش مجوزهای دسترسی و تفکیک کاربران
– استفاده از Stored Procedure در جهت ارتباط با بانک
– تفکیک وب سرور
– تنظیم گزارشهای خطا

منبع 1: OWASP Injection Flaws

منبع 2: SQL Injection Walkthrough

منبع 3: OWASP PHP Top 5

اسکن امنیتی وب سایت
(5000 تومان)

نوع وب سایت: وبلاگ، شرکتی، تجارت الکترونیک و کسب و کارحرفه ای
آسیب پذیری های OWASP (شامل بررسی 10 آسیب پذیری متداول)
اسکن نرم افزار/وب سایت توسط Acunetix نسخه 11
اسکن تمامی پورت ها با ابزار Nmap
اسکن وب سرور و پیکربندی آن توسط ابزار Nikto
اسکن تزریق توسط نرم افزار قدرتمند SQLmap