زمان مطالعه: 2 دقیقهSQL Injection یک نوع حمله با استفاده از ارسال یک رشته(String) حاوی کد مخرب به SQL Server Instance می باشد. کد مخرب حاوی یک دستور معتبر SQL است که به طور طبیعی توسط SQL سرور اجرا می شود.
فرم اولیه این نوع حمله شامل درج یک دستور SQL در مقادیری است که توسط برنامه از کاربر دریافت می شود. به طور مثال فرض کنید برنامه نام یک طرف حساب را دریافت و لیست سفارشات خرید مربوط به طرف حساب انتخابی را لیست می کند. کد مربوط به تهیه لیست می تواند شبیه به زیر باشد:
SELECT * FROM CustomerOrder WHERE CustomerName=’@pUserInput’
که @pUserInput پارامتر دریافت شده از کاربر است حال اگر کاربر قصد برنامه ریزی یک حمله را داشته باشد می تواند رشته ای با فرمت زیر را به عنوان نام طرف حساب به برنامه ارائه کند:
Mohammad’; DELETE FROM CustomerOrder—
دستور SQL که به سرور SQL ارسال می شود به صورت زیر خواهد بود:
SELECT * FROM CustomerOrder WHERE CustomerName=’ Mohammad’; DELETE FROM CustomerOrder—
ارسال این دستور به SQL سرور حاصلی جز حذف کلیه طرف حسابهای ثبت شده در پایگاه داده نخواهد داشت. توجه داشته باشید که (;) به مفهوم پایان یک دستور و شروع یک دستور دیگر بوده و (–) به مفهوم آنست که مابقی عبارت بعد از – برای SQL به منزله کامنت تلقی خواهد شد.
جهت جلوگیری از حملات از نوع SQL Injection باید تمامی اطلاعاتی که توسط برنامه از کاربر دریافت می شود به دقت ارزیابی و محتوای مشکوک و مخاطره آمیز پذیرش نشود. رعایت موارد زیر می تواند به طور قابل قبولی از حملات SQL Injection جلوگیری نماید:
۱- سایز و نوع دیتا دریافتی کنترل و محدودیتهای وابسته به نوع اطلاعات مورد نظر اعمال شود.
۲- محتوای دیتا کنترل و از پذیرش اطلاعات باینری، کاراکترهای کامنت و … خودداری شود.
۳- هیچگاه به طور مستقیم از دیتای وارد شده توسط کاربر دستور SQL ساخته نشود.
۴- کاراکتر های خاص نظیر (;),(‘),(–),(xp_),(/* */) در اطلاعات دریافت شده از کاربر پذیرش نشده و یا به نحو مناسب جایگزین شود.
۵- سایز و نوع پارامترهای وروی SP ها کنترل شود.
نکته ۱: اطلاعات دریافتی الزام به طور مستقیم از کاربر دریافت نمی شود و می تواند شامل اطلاعاتی باشد که قبلا در جداول پایگاه داده ذخیره شده است.