این 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 برای ایجاد بیانیه های آماده شده
مرحله 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 است
مرحله 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 است
مرحله 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 است
مرحله 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 ()؛ }