نحوه جلوگیری از تزریق SQL در PHP (همراه با تصاویر)

فهرست مطالب:

نحوه جلوگیری از تزریق SQL در PHP (همراه با تصاویر)
نحوه جلوگیری از تزریق SQL در PHP (همراه با تصاویر)

تصویری: نحوه جلوگیری از تزریق SQL در PHP (همراه با تصاویر)

تصویری: نحوه جلوگیری از تزریق SQL در PHP (همراه با تصاویر)
تصویری: آموزش وصل کردن گوشی به تلویزیون به چهار روش برای همه گوشی ها 2024, ممکن است
Anonim

این wikiHow به شما آموزش می دهد که چگونه با استفاده از Prepared Statements در PHP از تزریق SQL جلوگیری کنید. تزریق SQL امروزه یکی از رایج ترین آسیب پذیری های برنامه های تحت وب است. بیانیه های آماده شده از پارامترهای محدود استفاده می کند و متغیرها را با رشته های SQL ترکیب نمی کند و این باعث می شود که مهاجم نتواند دستور SQL را تغییر دهد.

بیانیه های آماده متغیر را با دستور SQL کامپایل شده ترکیب می کند ، به طوری که SQL و متغیرها به طور جداگانه ارسال می شوند. سپس متغیرها به عنوان یک رشته صرف تفسیر می شوند و بخشی از دستور SQL نیستند. با استفاده از روش های مراحل زیر ، نیازی به استفاده از سایر تکنیک های فیلتر کردن تزریق SQL مانند mysql_real_escape_string () ندارید.

مراحل

قسمت 1 از 2: درک تزریق SQL

مرحله 1. تزریق SQL نوعی آسیب پذیری در برنامه هایی است که از پایگاه داده SQL استفاده می کنند

این آسیب پذیری زمانی ایجاد می شود که از ورودی کاربر در یک SQL Statement استفاده شود:

$ name = $ _GET ['نام کاربری']؛ $ query = "SELECT password from tbl_user WHERE name = '$ name'"؛

مرحله 2. مقداری که کاربر در نام کاربری متغیر URL وارد می کند به نام متغیر $ اختصاص می یابد

سپس مستقیماً در دستور SQL قرار می گیرد و این امکان را برای کاربر فراهم می کند که دستور SQL را ویرایش کند.

$ name = "admin 'OR 1 = 1 -"؛ $ query = "SELECT password from tbl_user WHERE name = '$ name'"؛

مرحله 3. سپس پایگاه داده SQL دستور SQL را به شرح زیر دریافت می کند:

انتخاب رمز عبور از tbl_users WHERE name = 'admin' OR 1 = 1 - '

  • این SQL معتبر است ، اما به جای بازگشت یک رمز عبور برای کاربر ، این دستور تمام گذرواژه های جدول tbl_user را باز می گرداند. این چیزی نیست که شما در برنامه های وب خود می خواهید.

    قسمت 2 از 2: استفاده از mySQLi برای ایجاد بیانیه های آماده شده

    2542820 1
    2542820 1

    مرحله 1. پرس و جو mySQLi SELECT را ایجاد کنید

    از کد زیر برای انتخاب داده ها از یک جدول با استفاده از mySQLi Prepared Statements استفاده کنید.

    $ name = $ _GET ['نام کاربری']؛ if ($ stmt = $ mysqli-> آماده ("انتخاب رمز عبور از tbl_users WHERE name =؟")) {// یک متغیر را به عنوان یک رشته به پارامتر متصل کنید. $ stmt-> bind_param ("s" ، $ name) ؛ // دستور را اجرا کنید. $ stmt-> اجرا ()؛ // متغیرها را از پرس و جو دریافت کنید. $ stmt-> bind_result ($ pass) ؛ // واکشی داده ها $ stmt-> واکشی ()؛ // نمایش داده ها. printf ("رمز عبور برای کاربر٪ s٪ s / n است" ، $ name، $ pass)؛ // بیانیه آماده شده را ببندید. $ stmt-> close ()؛ }

    توجه: متغیر $ mysqli شی اتصال mySQLi است

    2542820 2
    2542820 2

    مرحله 2. پرس و جو mySQLi INSERT ایجاد کنید

    از کد زیر برای وارد کردن داده ها به جدول با استفاده از mySQLi Prepared Statements استفاده کنید.

    $ name = $ _GET ['نام کاربری']؛ $ password = $ _GET ['password']؛ if ($ stmt = $ mysqli-> prepa ("INTERT INTO tbl_users (name، password) VALUES (؟،؟)")) {// متغیرها را به عنوان رشته به پارامتر متصل کنید. $ stmt-> bind_param ("ss" ، $ name ، $ password) ؛ // دستور را اجرا کنید. $ stmt-> اجرا ()؛ // بیانیه آماده شده را ببندید. $ stmt-> close ()؛ }

    توجه: متغیر $ mysqli شیء اتصال mySQLi است

    2542820 3
    2542820 3

    مرحله 3. پرسش به روز رسانی mySQLi را ایجاد کنید

    از کد زیر برای به روز رسانی داده ها در یک جدول با استفاده از mySQLi Prepared Statements استفاده کنید.

    $ name = $ _GET ['نام کاربری']؛ $ password = $ _GET ['password']؛ if ($ stmt = $ mysqli-> Prepa ("UPDATE tbl_users SET password =؟ WHERE name =؟")) {// متغیرها را به صورت رشته به پارامتر متصل کنید. $ stmt-> bind_param ("ss" ، $ password ، $ name) ؛ // دستور را اجرا کنید. $ stmt-> اجرا ()؛ // بیانیه آماده شده را ببندید. $ stmt-> close ()؛ }

    توجه: متغیر $ mysqli شی اتصال mySQLi است

    2542820 4
    2542820 4

    مرحله 4. پرس و جو حذف mySQLi را ایجاد کنید

    اسکریپت زیر نحوه حذف داده ها از یک جدول با استفاده از mySQLi Prepared Statements است.

    $ name = $ _GET ['نام کاربری']؛ $ password = $ _GET ['password']؛ if ($ stmt = $ mysqli-> Prepa ("DELETE FROM tbl_users WHERE name =؟")) {// متغیر را به عنوان یک رشته به پارامتر متصل کنید. $ stmt-> bind_param ("s" ، $ name) ؛ // دستور را اجرا کنید. $ stmt-> اجرا ()؛ // بیانیه آماده شده را ببندید. $ stmt-> close ()؛ }

توصیه شده: