1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

(--(: مطالبی در مورد SQL Injection :)--!)

شروع موضوع توسط AftabGardoon ‏11/2/18 در انجمن SQL

  1. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    تعریفش: SQL Injection در لغت به معنای ترزیق کد SQL و در اصطلاح 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 کجا هستند؟

    ورودی اطلاعات به سایت شما معمولا کنترل هایی شبیه textBox , MemoBox , ComboBox و نظیر اینها هستند. ولی کنترلی که کاربر بتواند در آن کد بنویسد تکس باکس می باشد. همچنین خروجی برخی صفحات شما ورودی صفحه دیگریست که اطلاعات صفحه قبل را با queryString می گیرد.

    1. ورودی از تکس باکس textBox
    2. ورودی از آدرس بار QueryString
    چگونه از sql injection جلوگیری کنیم؟
    جهت جلوگیری از حملات از نوع SQL Injection باید تمامی اطلاعاتی که توسط برنامه از کاربر دریافت می شود به دقت ارزیابی و محتوای مشکوک و مخاطره آمیز پذیرش نشود. رعایت موارد زیر می تواند به طور قابل قبولی از حملات SQL Injection جلوگیری نماید:

    ۱- سایز و نوع دیتا دریافتی کنترل و محدودیت های وابسته به نوع اطلاعات موردنظراعمال شود.

    ۲- محتوای دیتا کنترل و از پذیرش اطلاعات باینری،کاراکترها یک امنتو … خود داری شود.

    ۳- هیچگاه به طورمستقیم از دیتای وارد شده توسط کاربر دستورSQL ساخته نشود.

    ۴- کاراکترهای خاص نظیر
    (;),(‘),(–),(xp_),(/* */) در اطلاعات دریافت شده از کاربر پذیرش نشده و یا به نحو مناسب جایگزین شود.

    ۵- سایزونوع پارامترهای ورویSP ها کنترل شود.

    نکته ۱: اطلاعات دریافتی الزام به طور مستقیم از کاربر دریافت نمی شود و می تواند شامل اطلاعاتی باشد که قبلا در جداول پایگاه داده ذخیره شده است.

    همچنین با کنترل ورودی های سایت می توان این کار را انجام داد.

    ۱- سعی کنید تا می توانید اطلاعات مهم را از طریق
    queryString پاس ندهید و از جایگزین هایی مانند Session، static variables , cooki و … استفاده کنید. ولی آی دی ها را از طریق queryString بفرستید، چرا که در موتورهای جستجو صفحات جداکانه برای سایتتان محسوب شود.

    ۲-حال فرض کنید مجبورید اطلاعات را از
    queryString پاس بدهید. در این صورت بهترین و مطمان ترین راه این است که داده ها را به صورت پارامتری در sql اجرا کنید تا مشکل هک بوجود نیاید. پارامتر مزیتی که دارد این است که هکر هرچقدر هم کد بنویسد و هر کدی بنویسد فقط به عنوان یک پارامتر ورودی در sql محسوب می شود و بخشی از دستور نمی شود. این موضوع در مورد تکس باکس ها هم وجود دارد.
    ۳- باز هم فرض می کنیم مجبورید از روش غیر پارامتری استفاده کنید. در اینجا باید داده های ورودی را چک کنید که کد اینجکشن نباشد:

    1. روش اول اینست که آی دی ها را به نوع عدد صحیح تبدیل کنید تا هکر نتواند به جز ارقام وارد کند.
    2. روش دوم اینست که عبارات مشکوک که سایت شما را هک می کند فیلتر کنید. مانند: union select, Table_Name, Order by , — و مانند اینها
    3. راه بعدی اینست که ورودی ها را انکد کنید.
     
    Shahab و *Deniz* از این پست تشکر کرده اند.