آموزش طراحی وب

Patch کردن باگ SQl در PHP

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

 security

سلام خدمت همراهان همیشگی مدرسه مجازی ایرانیان

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

 

باگ SQl چیست ؟

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

قصد دارم با چند مثال این موضوع رو براتون باز کنم و نحوه ی برطرف کردن این باگ رو توضیح بدم . به کد زیر توجه کنید :

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

بوسیله ی دستور union دو دستور select رو کنار هم قرار میده و تمامی کاربران موجود در جدول admin رو میتونه مشاهده کنه .

 

نحوه Patch کردن این باگ

حالا چطور میتونیم این باگ رو برطرف کنیم و از این حمله جلوگیری کنیم ؟ از طریق چند روش میتونید این کار رو انجام بدید .

استفاده از تابع int

این تابع ورودی رو چک میکنه و سپس به دیتابیس ارسال میکنه . اگر عدد وارد نشده باشه ، ارتباط با دیتابیس برقرار نمیشه .

 

استفاده از تابع ctype_digit()

این تابع هم تقریبا کار بالارو انجام میده :

 

استفاده از mysql_real_escape_string

این کد تمامی ورودی های مضر و خطرساز رو خنثی میکنه و داده های امن رو به دیتابیس ارسال میکنه :

 

استفاده از str_replace

این تابع مقدار اول رو به مقدار دوم تبدیل میکنه . مثلا اگر در ورودی عبارت hack وجود داشت با عبارت none جایگزینش کنه :

 

استفاده از sanitize و فیلتر کردن ورودی

میتونید از تمامی توابع امنیتی بصورت یکجا استفاده کنید . به این صورت که یک تابع بنویسید و تمامی این توابع رو درون اون تابع قرار بدید . به تابع زیر دقت کنید :

 

شما ورودی خودتون رو توسط این تابع فیلتر میکنید و سپس آن را به دیتابیس ارسال میکنید ، این ورودی میتونه از URL باشه و یا میتونه داده هایی باشه که از طریق فیلدهای متنی از جانب کاربر ارسال میشه ، فقط کافیه ورودی رو از این تابع رد کنید :

 

استفاده از PDO

PDO یک افزونه ی امنیتی هست که میتونید از اون برای فیلتر کردن ورودی استفاده کنید . PDO یکی از قوی ترین راه های حفظ امنیت در php است . کد زیر رو در نظر بگیرید :

این کد رو با استفاده از این افزونه بصورت زیر مینویسیم :

در ابتدا با بانک اطلاعاتی ارتباط برقرار می کنیم :

 

سپس کد رو با PDO به صورت زیر مینویسیم :

 

ورودی رو مشخص می کنیم :

 

و در نهایت این درخواست رو اجرا می کنیم :

 

خوب دوستان راه هایی که برای جلوگیری از حمله های SQLI بهتون معرفی کردم یکی از بهترین راه های مقابله با هک می باشد که میتونید در پروژه های خودتون به راحتی استفاده کنید .

موفق و پیروز باشید .

تهیه شده در مدرسه مجازی ایرانیان

حسین همت یار

نویسنده در مدرسه مجازی ایرانیان ، دانشجوی رشته IT ، طراح وب و علاقه مند به تازه های دنیای اینترنت و وب و البته لینوکس

دیدگاه ۶

    • سلام دوست عزیز
      بله sql injection یک تکنیک برای هک کردن سایت از طریق باگ های موجوده.
      در این مقاله در هیچ کجا sql injection باگ خطاب نشده . بلکه در مورد باگ هایی صحبت شده که برنامه نویس میتونه با برطرف کردن اون ها جلوی inject رو بگیره . زمانی که برنامه نویسی شما طوری باشه که سایت روزنه ای برای حمله داشته باشه این نوع برنامه نویسی باگ داره.
      موفق باشید.

  • ممنون از پست خوبتون

    یه سوال .

    استفاده ترکیبی از فیلتر کننده هارو پیشنهاد میکنید یا خیر ؟

    ایا استفاده از Mysql_real_scape_string به تنهایی کافیه تا تمامی ورودی های مضر پچ بشن ؟

    آیا سایت های بزرگ برای فیلتر کردن ورودی ها از همین استفاده میکنن یا روش پیچیده تری دارن ؟

    • سلام

      خواهش میکنم ، صد در صد از فرمول های پیچیده تری استفاده می کنن . میتونید هم ترکیبی استفاده کنید هم تکی ، فقط باید حواستون باشید وقتی ترکیبی استفاده میکنید به گونه ای نباشه که سرعت عملکرد و کند کنه و با هر بار req به سرور فشار بیاره .

      موفق باشید

نظرسنجی

به کدام دسته موضوعی علاقه مند هستید؟

اموزش تصادفی