تعداد زیادی از وب سایت ها در جهان از PHP استفاده می کنند. این احتمال وجود دارد که دیر یا زود نیاز به استفاده از PHP داشته باشید، بنابراین بهتر است آشنایی بیشتری با آن پیدا کنید. با توجه به ساختار و سهولت استفاده از PHP، کدهای PHP زیادی وجود دارند که یا توسط افراد حرفه ای نوشته نشده اند یا از به روزترین روش های کدنویسی پیروی نمی کنند. این امر، در میان سایر مشکلات، حاکی از فراوانی آسیب پذیری های امنیتی در چنین سیستم هایی است. به عنوان یک توسعه دهنده وب، این مورد به شما بستگی دارد که اطلاعات مشتری خود را ایمن نگه دارید.
تصویر(1)
زبان برنامه نویسی سمت سرور 79 درصد از سایت ها، php است. PHP بی سر و صدا به یک فناوری اصلی تبدیل شده که در اکثر سایت های جهان استفاده می شود. این محبوبیت به نوبه خود چالش جدیدی به نام امنیت php را به وجود آورده است و مقوله آسیب پذیری های امنیتی در php را به یک چالش تبدیل کرده است. در این مقاله توضیحاتی در خصوص آسیب پذیری های مهم PHP و راه حل های رفع آنها بیان شده است.
چرا امنیت PHP مهم است؟
استفاده گسترده از php و یک جامعه برنامه نویسی فعال، موجب شد تا نظر محققان امنیتی و هکرها به سمت آن جلب شود. در واقع، همانطور که تحقیقات اخیر نشان می دهد، بسیاری از نرم افزارهای PHP به دلیل طراحی بد و درک ضعیف از شیوه های امنیتی پایه، آسیب پذیری های زیادی دارند. برای یادگیری نحوه کاهش آسیب پذیری های امنیتی در php یا رفع کامل آنها، ادامه این مقاله را دنبال کنید.
7 مشکل امنیتی و آسیب پذیری های امنیتی در php و نحوه رفع کامل آن ها
SQL زبانی است که برای ذخیره اطلاعات در پایگاه های داده و بازیابی اطلاعات از آن استفاده می شود. به عنوان مثال، وقتی فرم ثبت نام سایتی را پر می کنید، وب سرور، داده ها را می خواند. همچنین ممکن است وب سرور درخواستی را برای بازیابی اطلاعات خاص، به یک پایگاه داده ارسال کند.
SQL Injection با استفاده از حفره های امنیتی موجود در لایه های دیتابیس، مانند یک کوئری SQL که می تواند اطلاعات حساس را در اختیار فرد مهاجم قرار دهد، کدهای مخرب sql را به جای کدهای سالم اجرا می کند. اطلاعات افشا شده می تواند شامل کل محتوای پایگاه داده، اطلاعات خصوصی، رمزهای عبور و غیره باشد. جلوگیری از SQL Injection نسبتا ساده است. برای جلوگیری از این نوع آسیب پذیری های امنیتی در php باید از کوئری های پارامتری و عبارات آماده استفاده شود.
2. XSS یا Cross-Site Scripting (اسکریپت بین سایتی)
Cross-Site Scripting زمانی اتفاق می افتد که مهاجم اسکریپتی را در سایت قربانی قرار دهد تا در زمان بازدید کاربران از آن سایت، کدها از سایت دیگری اجرا شوند.
به عنوان مثال، یک پیام رسان را تصور کنید که در آن افراد می توانند برای یکدیگر پیام بگذارند. اگر نرمافزار پیام رسان، پیامهایی را که کاربران ارسال میکنند اعتبارسنجی نکند، هر کسی که از سایت بازدید میکند میتواند کد مخرب را اجرا و اطلاعات حساس کاربرانی که در معرض این کد قرار میگیرند را سرقت کند.
تصویر(2)
برای از بین بردن حمله XSS، باید تمام ورودی های سایت پاکسازی شوند. پاکسازی، محدود به دادههای ذخیرهشده نیست، بلکه دادههای خروجی مانند نتایج جستجو که محتوای URL را در صفحه وب پاکسازی نشده اجرا می کند، به هکر اجازه میدهد یک لینک منحصربهفرد ایجاد و با کلیک روی آن حمله XSS خود را آغاز کند.
3. جعل درخواست بین سایتی (Cross-Site Request Forgery) یا CSRF
جعل درخواست های بین سایتی، با استفاده از مهندسی اجتماعی و تکنیک های فیشینگ، از اعتماد کاربر به سایت سو استفاده و کاربر را متقاعد می کند تا روی لینک ساخته شده کلیک نماید. این اقدام باعث می شود که مهاجم به طور مخفیانه اطلاعات اتصال را به سرقت برده و دستورات شبه قانونی را از سمت کاربر برای سرور سایت ارسال کند.
تصویر(3)
راه حل توصیه شده برای حملات CSRF، استفاده از احراز هویت است که برای عملیات حساس، اعتبارسنجی انجام شود. یک توکن جدید در هر ورود ایجاد و در یک کوکی ذخیره می گردد که بدون دسترسی به توکن، انجام اقدامات غیرمجاز را برای هکرها بسیار دشوار میکند.
4. PHP Object Injection
حمله PHP Object Injection می تواند از فراخوانی تابع ()unserialize برای تزریق PHP Object به memory سو استفاده کند. چنین حملاتی را می توان در سایتی فعال نمود که یک متد PHP magic مانند __wakeup یا __destruct را در یکی از کلاس های خود پیاده سازی کرده باشد.
یک تزریق موفق PHP Object، میتواند منجر به حملات بیشتری مانند SQL Injection، Code Injection، Path Traversal و حتی حذف کامل اطلاعات سایت شود. برای جلوگیری از حملات PHP Object Injection، باید ورودی های سایت را اعتبارسنجی و پاکسازی نمایید تا از ارسال PHP Object ها جلوگیری شود.
5. دور زدن احراز هویت (Authentication Bypass)
دور زدن احراز هویت ناشی از خطای برنامه نویس است که در آن اعتبار کاربر را به درستی بررسی نمیکند و به اشتباه دسترسی بالاتری به آن میدهد.
به عنوان مثال، بسیاری از توسعه دهندگان مبتدی وردپرس، برای تایید کاربر در سطح مدیر از تابع ()is_admin استفاده می کنند اما این تابع در واقع برای تایید این است که آیا کاربر در حال مشاهده یک صفحه از پنل مدیریت می باشد یا خیر. استفاده نادرست از این تابع باعث شده تا کاربران زیادی با دور زدن احراز هویت در سایت شان مواجه شوند.
رفع این نوع آسیب پذیری های امنیتی در php نیاز به بررسی کدهای سایت توسط یک برنامه نویس با تجربه دارد تا اطمینان حاصل شود که هیچ اشتباهی در فرآیندهای احراز هویت و توکن ها رخ نداده است. علاوه بر این، ابزارهای SAST یا Static Application Security Testing (تست امنیت برنامه استاتیک) نیز میتوانند به کشف چنین نقصهای امنیتی در کدها کمک کنند.
6. ربودن سشن (Session Hijacking)
هر زمان که وارد سیستم می شوید، سایت یک "سشن" برای حفظ وضعیت ورود ایجاد می کند تا برای دفعات بعدی نیاز به احراز هویت مجدد نباشد. حمله XSS یا CSRF می تواند به هکر اجازه دهد تا بدون اینکه احراز هویت را دور بزند اطلاعات سشن فعلی را کپی و از نرم افزار تحت وب کاربر استفاده کند.
برای کاهش احتمال Session Hijacking، میتوانید به طور مکرر و تا حدی که برای کاربر آزاد دهنده نباشد، session ID را با استفاده از تابع ()session_regenerate_id تغییر دهید و از دسترسی جاوا اسکریپت به دادههای Session ID با استفاده از تنظیمات session.cookie.httponly در php.ini یا تابع ()session_set_cookie_params جلوگیری کنید.
7. حملات Stream Injection
حملات Stream Injection در واقع سو استفاده از قابلیت آپلود سایت ها مانند دریافت فایل ها و تصاویر می باشد. هکر سعی می کند با استفاده از آپلود یک فایل، کد PHP سایت هدف را فریب دهد تا یک URL مرتبط با سایتی دیگر را به عنوان ورودی معتبر تایید کرده و از این عمل برای اجرای کدهای مخرب استفاده نماید.
یک مثال رایج آن، فایل پیکربندی wp-config.php وردپرس می باشد اما این حمله میتواند برای فایلهای PHP اجرا کننده سایت نیز مورد استفاده قرار گیرد که باعث می شود هکر به دیگر آسیب پذیری های امنیتی در php نیز دسترسی پیدا کند. نسخه های جدید PHP، به طور پیشفرض در برابر حملات Stream Injection محافظت شده اند. اما ممکن است توسعهدهندگان تازه کار بدون اطلاع از عواقب احتمالی این قابلیت را فعال کنند. برای بررسی این نقص امنیتی، باید به دنبال اجرای ناامن توابع include, include_once, fopen, file_get_contents, require, و require_once در PHP باشید.
تایید، احراز هویت و اعتبارسنجی
نکته بسیار مهم در اکثر مسائل امنیتی وب، استفاده مناسب از عملکردهای احراز هویت و مدیریت سشن می باشد. در واقع هر ورودی که نرم افزار تحت وب در سمت سرور می پذیرد، باید تایید و احراز هویت شود. در بسیاری از موارد، ممکن است نرم افزار تحت وب برای عملکرد مناسب، به چندین کتابخانه متن باز وابسته باشد. این کتابخانهها میتوانند شامل مشکلات و آسیب پذیری های امنیتی در php باشند که نیاز است حتما از یک سرویس اسکن آسیبپذیری، برای کنترل کدهای آن استفاده شود.
در نهایت، موردی را تصور کنید که در آن کد نرم افزار تحت وب شما با استفاده از یک حمله Stream Injection حذف میشود. آیا می دانید سورس کد شما چه اطلاعات مهمی را ذخیره می کند؟ ممکن است یک توسعه دهنده با دانش ضعیف از DevSecOps، رمز عبور پایگاه داده را مستقیماً در کد ذخیره کرده باشد. برای جلوگیری از تبدیل یک حمله جزئی به یک حمله تمام عیار، باید از اسکن اطلاعات حساس برای حذف آنها از کدهای سایت، استفاده کنید.