امنیت در PHP – فرم ها

سلام به همه ی دوستان گرامی , با توجه به درخواست یکی از کاربران عزیز تصمیم گرفتیم در مورد امنیت در PHP پست بزاریم.

برنامه نویسی PHP مثل خیلی از زبان های دیگه شاید در ابتدا راحت به نظر بیاد و ما توی چندین روز یا چندین ماه یک پروژه ی بزرگ رو انجام بدیم و روی سرور بزاریم , اما وقتی که تعداد بازدیدکننده ها از سایت ما زیاد میشه خیلی از نکات باید مورد توجه قرار بگیره که تامین امنیت (خودش جنبه های مختلف داره) یکی از این نکات است.

ما در اینجا تصمیم داریم با کمک مثال های متعدد شما دوستان عزیز رو با مسائل امنیتی و نحوه ی تامین امنیت اشنا کنیم ;-D نگران هیچ چیز نباشید و با ما همراه باشید.

چند تا از مسائل مهمی که ممکنه هنگام کار کردن با فرم ها پیش بیاد به صورت زیر است :

  • حملات از نوع XSS به صفحات سایت
  • حملات از نوع Injection به دیتابیس
  • تزریق داده های غیر مجاز

حملات xss به صفحات سایت :

حملات xss اصلا چی هست؟ xss مخفف کلمات Cross-site scripting است , حرف x نشان دهنده این است که حمله در کامپیوتر های مختلف اجرا میشه و منظور کامپیوتر های کاربران است نه سرور اصلی! در حملات از نوع xss هکر یا اختلالگر یک کد از نوع کدهای سمت کاربر یا کلاینت (client-side) رو به صفحات ما اظافه میکنه و این کار باعث میشه یک سری دستورات روی کامپیوتر کاربر اجرا بشه که باعث ازار و اذیت کاربران میشه و اون اعتبار و اعتماد کاربران به سایت ما رو از بین میبره! حتی در بعضی مواقع ممکنه که با استفاده از حملات xss سایت شما رو مورد انالیز قرار بدن و تعداد بازدید و علاقمندی بازدید کننده های شما رو تشخیص بدن!

بیشترین حملات xss از طریق فرم های نظر سنجی یا کامنت انجام میشه, در این حالت هکر میاد به جای اینکه به صورت متن ساده برای شما نظر بزاره از دستورات سمت کاربر یا کلاینت مثل html , css ,js ,svg استفاده میکنه و یه دستور خوشکل و تپل براتون میفرسته 😀 شما هم ذخیره میکنید و به کاربران خودتون نشون میدید , بعدش یهو متوجه میشید که اخ اخ اخ صفحه چرا خراب شده! حالا به مثال زیر دقت کنید: (برای دیدن مثالی از فرم اینجا کلیک کنید و بعد از پرکردن و فشردن دکمه ی ارسال فرم میتونید داده های ذخیره شده رو از اینجا ببینید)

در مثال بالا یه فرم ساختیم که نتیجه ی اون فرم رو بعد از پر کردن فرم و فشار دادن دکمه ی ارسال میتونید از اینجا ببینید(کلیک کنید) , این فرم یه مشکل بزرگ داره , مشکلش در این است که جلوی حملات XSS رو نمیگیره! کافیه که یه نظر مثل زیر توی اون بنویسید:

در دستورات بالا پایین نظرات خودمون یه دستور alert جاوا اسکریپتی نوشتیم که باعث میشه پیام مورد نظر ما به کاربران نشون داده بشه 😀 حالا اگه یه سایتی باشه که جلوی این نوع حملات رو نگیره شما به راحتی میتونید بهش حمله xss بزنید 😀

چجوری میشه از حملات XSS جلوگیری کرد؟ شما کافیه محتوای که از فرم ها دریافت میکنید رو با تابع htmlentities به صورت فرم متن ساده در بیارید. کد هایی که در بالا نوشته بودیم رو میتونیم به صورت زیر ویرایش می کنیم:

در دستورات بالا تابع htmlentities از حملات XSS جلوگیری میکنه , به همین راحتی.(فرم نهایی که از حملات جلوگیری میکنه رو میتونید از اینجا , و نتایج فرم رو از اینجا ببینید , دستورات XSS که در بالا مطرح کردیم یا هر دستور دیگه از نوع XSS رو باهاش تست کنید و نتیجه رو با حالت قبل مقایسه کنید!).

حملات نوع Injection به دیتابیس:

حملات از نوع injection به این صورت است که هکر میاد یکسری دستورات SQL رو به فرم ما اظافه میکنه و این دستورات به جای اینکه در دیتابیس ذخیره بشن , اجرا میشن! اجرا شدن این دستورات در بیشتر مواقع باعث از بین رفتن اطلاعات میشه اما مواقعی هم وجود داره که هدف دزدیدن اطلاعات کاربران است! به حملاتی که با تزریق کد SQL به پایگاه داده انجام میشن حملات Injection میگن. مثلا به کد زیر دقت کنید:

در کد بالا ما میایم مقداری رو از فرم میگیریم و توی دیتابیس خودمون ذخیره میکنیم , کاربر میتونه دستوراتی رو توی فرم ما درج کنه که در دیتابیس ما اجرا بشه و باعث ایجاد اخلال در کل سیستم ما بشه مثلا میتونه دستوری مانند دستور زیر اجرا کنه:

کافیه که کاربر دستور بالا رو توی فرم وارد کنه و دکمه ی ارسال رو بزنه! تا کوئری به شکل زیر توی دیتابیس ما اجرا بشه:

بعدش پووووف همه چیز از بین میره! به خاک سیاه میشینیم 😀 کلا جدول مربوط به کامنت ها comments پاک میشه, البته این یه مثال ساده است و خیلی کارای پیچیده تری میشه انجام داد مثلا جابه جایی پرداخت های مالی از حساب یه نفر به حساب یه نفر دیگه با حملات Injection میتونه انجام بشه!

برای جلوگیری از این نوع حملات میشه از دو روش استفاده کرد:

روش اول : کشف دستورات SQL و حذف کردن آنها از داده ها.

روش دوم : استفاده از دستورات آماده یا prepare شده.

روش اول : برای کشف دستورات SQL و حذف کردنشون میتونیم به روش های زیر عمل کنیم:

در mysqli میتونید از تابع mysqli_real_escape_string استفاده کنید و در PDO میتونید از تابع quote استفاده کنید , به مثال زیر دقت کنید:

در مثال بالا مقادیری که از فرم خودمون دریافت میکنیم رو ابتدا با استفاده از دستوراتی که معرفی کردم (با توجه به اینکه از mysqli استفاده میکنیم یا PDO) نرمال سازی میکنیم بدین معنی که دستورات SQL درون داده هایی که قراره در پایگاه داده ذخیره بشن رو حذف میکنیم و سپس داده ها رو در پایگاه داده قرار میدیم.

روش دوم : من این روش رو به روش قبل ترجیح میدم چون قابل اعتماد تره! در این روش ابتدا میایم کوئری یا همون دستوراتی که SQL هستن و قراره اونا رو اجرا کنیم مشخص میکنیم , دستورات SQL خودمون رو آماده میکنیم و سپس داده های خودمون رو به چیزی که آماده کردیم میدیم تا اجرا بشه! برای اینکه بهتر متوجه بشید به مثال زیر دقت کنید:

در مثال بالا ابتدا یک متغیر با نام query تعریف کردیم و سپس اون رو با تابع prepare اماده کردیم (این تابع در mysqli و PDO یکسان است) در مرحله ی بعد مقداری که از ورودی میگیریم رو با استفاده از چیزی که آماده (prepare) کردیم ذخیره میکنیم 😀 به همین راحتی. دوستان عزیز دقت کنید که در mysqli اگه میخواید از دستورات اماده یا prepare رو استفاده کنید بهتره که از حالت شی گرا در mysqli استفاده کنید در غیر این صورت کارشما سخت میشه (حالت تابعی در mysqli رو پیشنهاد نمیکنم چون اصلا جالب نیست و یادگیریش یکم سخته برام!).

تزریق داده های غیر مجاز :

فرض کنید یک فرم ثبت نام دارید و کاربر میتونه از اون طرح خودشو انتخاب کنه و ثبت نام کنه , طرح های شما به صورت سه ماهه , شش ماهه و یکساله باشه! ما در فرم زیر طرح رو دریافت میکنیم و ذخیره میکنیم:

فرم بالا در هنگام ذخیره سازی یک اشکال خیلی بزرگ داره! میشه داده های غیر مجاز رو به فرم تزریق کرد و عمل ذخیره سازی انجام میشه! مثلا کاربر ما میتونه روی فرم کلیک راست کنه و گزینه Inspect Element رو بزنه و بعدش از ادیتور باز شده یه طرح دلخواه اظافه کنه و برای ما ارسال کنه 😀 مثلا طرح یک ماهه اظافه کنه , به تصویر زیر دقت کنید:

code-injection-example-firefoxدر تصویر بالا من روی فرم کلیک راست کردم و یک گزینه option اظافه کردم و مدت طرح خودمو توش نوشتم. بعدش enter بزنید تا تغییرات انجام بشه و توی فرم طرح جدیدی که تزریق کردید رو انتخاب کنید و ارسال رو بزنید! میبینید که فرم ذخیره میشه 😀 به همین راحتی هکر شما رو گول میزنه! شما باید قبل از ذخیره کردن ابتدا طرح رو بررسی کنید و اگه طرح قابل قبول بود اون رو ذخیره کنید , مثال بالا رو میتونیم به شکل زیر تصحیح کنیم:

در کد بالا اگه شما یک طرح جدید به فرم تزریق کنید و اون رو انتخاب کنید عمل ذخیره کردن انجام نمیشه و میگه که طرح شما نا معتبر است 😀

یه خاطره حتما بخونید جالبه : عمل تزریق داده های غیر مجاز میتونه خیلی گسترده تر باشه! یه بار یکی از دوستان سایت طراحی کرده بود که میشد محصولات رو خریداری کرد مثلا چندتا موبایل بود که میشد هرکدوم رو که میخوایم سفارش بدیم تا برامون ارسال بشه با پست و بعدش ما پولشو بدیم! من یه گوشی میخواستم توی لیست محصولات اصلا نداشتن! کلیک راست کردم محصول رو تزریق کردم و سفارش دادم 😀 مدیران سایت تعجب کردن که وقتی چنین محصولی رو ندارن چجوری سفارش داده شده 😀 بعدش خودم به دوستم گفتم و مشکل رو برطرف کردیم.

امیدوارم که این آموزش بدرد دوستان خورده باشه. مباحث امنیت خیلی زیاد و گسترده است. باقی مباحث رو ایشالله در آموزش های بعدی خواهیم گفت. موفق باشید 🙂

به اشتراک بگذارید:Email this to someoneShare on FacebookTweet about this on TwitterShare on Google+Digg thisShare on LinkedInPin on PinterestShare on StumbleUponFlattr the authorShare on RedditBuffer this pageShare on TumblrPrint this pageShare on YummlyShare on VK
  1. علی طبا

    ممنون از سایت باحالتون. نکنه یه وقت برید سراع آگهی و ….
    منتظر بقیه اش هستیم.

می‌خواهید دیدگاهتان را بیان کنید؟