امنیت PHP و چالش های پیش روی آن
ازآنجاییکه PHP پایه سایتهای وردپرسی و همچنین بقیه سایتهایی که به این زبان نوشتهاند است، بنابراین، امنیت PHP بسیار حائز اهمیت است. PHP میتوانند از تهدیدات رایج مانند جعل درخواستهای متقابل سایت، تزریق SQL، دستکاری دادهها و… رنج ببرد که در این مقاله به این تهدیدات رایج در PHP خواهیم پرداخت.
گفته میشود PHP قویترین زبان سمت سرور است، PHP از 80 درصد وب جهان با 10 میلیون دامنه برتر استفاده میکند و با این وجود PHP یک زبان امن به حساب می آید. به همین دلیل، استفاده صحیح از PHP به شما کمک میکند تا در برابر مهاجمان از وبسایتها و دادههای خود محافظت کنید.
PHP پراستفادهترین زبان برنامهنویسی وب سمت سرور در سراسر جهان است. برنامههای مختلف PHP بخشهای مختلفی از کد و اسکریپتهای خود را با سایر برنامههای کاربردی وب به اشتراک میگذارند. درصورتیکه کد به اشتراک گذاشتهشده آسیبپذیر تشخیص داده شود، همه برنامههایی که از آن قطعه کد مشترک استفاده میکنند در معرض خطر قرار میگیرند و آسیبپذیر در نظر گرفته میشوند. با توجه به این ویژگی PHP میتوان گفت امنیت PHP دوچندان حائز اهمیت شده است.
بررسی امنیت PHP
PHP بهاندازه هر زباناصلی سمت سرور امن است و در امنیت نسبی PHP شکی وجود ندارد؛ اما این به این معنی نیست که این زبان ازلحاظ امنیتی نقطهضعفی ندارد. هیچ زبان برنامهنویسی در دنیا نمیتواند ادعا کند که 100 در صد امن است و این ویژگی برای PHP نیز صادق است. با چارچوبها و ابزارهای جدید PHP که در چند سال گذشته معرفیشدهاند، اکنون مدیریت امنیت PHP بسیار سادهشده است.
اگر مقایسهای انجام دهیم PHP اگر از زبانهای دیگر امنتر نباشد، بدتر هم نیست. جاوا، جاوا اسکریپت و سایر زبانها، همگی آسیبپذیریهای خود را در طول سالها داشتهاند.
چرا امنیت PHP مهم است؟
تحقیقات اخیر نشان میدهد، بسیاری از برنامههای PHP به دلیل طراحی بد و درک ضعیف از شیوههای امنیتی اساسی موردنیاز برای ایمنسازی یک برنامه وب، از آسیبپذیری رنج میبرند.
PHP کدی است که وبسایت وردپرس شمارا اجرا میکند. پلاگین ها، تمها و سایر برنامههای نصبشده در وبسایت شما مانند phpmyadmin نیز شامل کد PHP هستند. از طرفی اغلب سیستمهای مدیریت محتوا و وبسایتهای اختصاصی با PHP نوشتهشدهاند و از این لحاظ امنیت PHP بسیار حائز اهمیت شده است.
پیشنهاد مطالعه: آنچه که باید در مورد هک و امنیت بدانیم
انواع آسیبپذیریها در PHP
آسیبپذیریها در PHP بهطورکلی بر اساس نوعشان دستهبندی میشوند. در زیر فهرستی از رایجترین انواع آسیبپذیریها در کدهای PHP و توضیح اولیه هرکدام آورده شده است.
کنترل از راه دور یا RCE
آسیبپذیری کنترل از راه دور یا (RCE) زمانی اتفاق میافتد که مهاجم بتواند کدی را در وبسایت شما آپلود کرده و آن را اجرا کند. یک نقض در یک برنامه PHP ممکن است ورودی کاربر را بپذیرد و آن را بهعنوان کد PHP ارزیابی کند. این نقض امنیتی در PHP میتواند به مهاجم اجازه دهد تا به وبسایت بگوید که یک فایل جدید حاوی کدی ایجاد کند که به مهاجم اجازه دسترسی کامل دهد.
به عبارت دیگر هنگامیکه یک مهاجم کدی را به برنامه وب شما میفرستد و اجرا میشود و به مهاجم اجازه دسترسی میدهد، آنها از یک آسیبپذیری RCE سوءاستفاده کردهاند.
این آسیبپذیری بسیار جدی است و بهراحتی قابل بهرهبرداری است و بلافاصله پس از بهرهبرداری، دسترسی کامل به مهاجم را میدهد.
SQL Injection یا SQLi
SQL Injection زمانی اتفاق میافتد که یک مهاجم بتواند دستورالعملهای خود را به پایگاه داده شما ارسال کند و پایگاه داده آن دستورالعملها را اجرا کند. این آسیبپذیری که یک نقض امنیت در PHP است زمانی اتفاق میافتد که یک توسعهدهنده PHP ورودی یک بازدیدکننده وبسایت را دریافت کرده و بدون بررسی اینکه آیا حاوی چیزهای مخربی است یا خیر، آن را به پایگاه داده ارسال میکند.
SQL Injection میتواند به مهاجم اجازه دسترسی به تمام دادههای وبسایت شمارا بدهد. آنها همچنین میتوانند دادههای جدیدی را در پایگاه داده شما ایجاد کنند که ممکن است شامل لینکهایی به وبسایتهای مخرب یا هرزنامه باشد. یک مهاجم همچنین ممکن است بتواند از SQL Injection برای ایجاد یک حساب کاربری جدید در سطح مدیریتی استفاده کند که سپس میتواند از آن برای ورود به وبسایت شما و دسترسی کامل استفاده کند. SQLi یک آسیبپذیری جدی است زیرا بهرهبرداری از آن آسان است و فوراً دسترسی کامل به هکر را اعطا میکند.
Cross-Site Scripting یا XSS
اسکریپت بین سایتی (XSS) زمانی اتفاق میافتد که یک مهاجم باعث میشود کدهای مخرب در مرورگر بازدیدکننده وبسایت بارگیری و اجرا شود. سپس این کد میتواند اقدامات مخربی مانند سرقت کوکیهای کاربر که میتواند به سطح مدیریت دسترسی دهد، یا انجام عملکردهایی بهعنوان کاربر که میتواند دسترسی اضافی را اعطا کند، انجام دهد.
دو نوع XSS وجود دارد: XSS ذخیرهشده و XSS منعکسشده. آسیبپذیری ذخیرهشده XSS زمانی رخ میدهد که یک مهاجم بتواند وبسایت را برای ذخیره کدهای مخرب که بعداً در مرورگر کاربر دیگر ارائه میشود و اجرا میکند، وادار کند. نمونهای از XSS ذخیرهشده جایی است که یک مهاجم نظری را در وبسایت وردپرس شما ارسال میکند که حاوی کدهایی است که کوکیهای کاربر را میدزدد و آنها را بهجایی میفرستد.
XSS منعکس زمانی اتفاق میافتد که مهاجم لینکی را ایجاد کند که حاوی کد مخرب باشد. اگر پیوند در یک مرورگر بارگذاری شود، وبسایت کدهای مخرب را بهعنوان بخشی از محتوای وبسایت ارائه میکند. این کد سپس در مرورگر کاربر اجرا میشود و میتواند کوکیها را بدزدد یا کارهای مخرب دیگری را انجام دهد. بهصورت کلی از XSS میتوان بهعنوآنیک مسئله امنیت در PHP نگاه کرد و باید به آن توجه ویژهای داشت.
آسیبپذیری ross-Site Request Forgery یا CSRF
جعل درخواست متقابل سایت (CSRF) زمانی اتفاق میافتد که مهاجم میتواند لینک مخربی ایجاد کند و از مدیر سایت یا شخصی با دسترسی ممتاز بخواهد روی آن لینک کلیک کند که باعث میشود سایت اقدامی انجام دهد. بهعنوانمثال، اگر یک مهاجم بتواند لینکی ایجاد کند که با کلیک روی یک مدیر روی آنیک مدیر جدید با رمز عبور شناختهشده ایجاد کند، اینیک حمله CSRF خواهد بود. این مسئله در امنیت PHP مهم است و باید به آن پرداخته شود.
وردپرس یک راه هوشمندانه برای محافظت در برابر این نوع حمله با استفاده از ویژگی به نام “nonce” دارد. nonce یک نشانه امنیتی است که هر بار که به ادمین وارد میشود به آن اعطا میشود. هر بار که یک مدیر سایت در وردپرس کار حساسی انجام میدهد، مرورگر آنها یک “nonce” را شامل میشود. اگر مهاجمی بخواهد لینکی ایجاد کند تا در حمله CSRF از آن استفاده کند، باید “non” را نیز برای ارسال با آن لینک بداند. Nonce روزانه تغییر میکند و از حملات CSRF جلوگیری میکند.
دور زدن احراز هویت
گاهی اوقات یک توسعهدهنده PHP فکر میکند که سطح دسترسیها را وارد کرده است و هر کاربری متناسب با دسترسی خودش میتواند اقداماتی را انجام دهد.
یکی از راههایی که این نقض امنیتی معمولاً وارد برنامههای وردپرس میشود، از طریق اشتباه رایج توسعهدهندگان وردپرس است که در آن از تابعی به نام «is_admin()» برای تأیید اعتبار مدیر بودن شخصی استفاده میکنند. این تابع درواقع به این منظور طراحیشده است که به شما بگوید آیا شخصی در حال مشاهده یک صفحه مدیریت است و اعتبار بازدیدکننده سایت درواقع یک مدیر است. اگر توسعهدهندهای مرتکب این اشتباه شود، میتواند به کاربران غیر سرپرست اجازه دسترسی به ویژگیهایی را بدهد که فقط مدیران به آنها دسترسی دارند. اینیک آسیبپذیری احراز هویت در امنیت PHP است.
تزریق شی به PHP
این آسیبپذیری در PHP یک حمله پیچیده است و زمانی اتفاق میافتد که یک برنامه PHP ورودی کاربر را میگیرد و آن را به تابعی به نام «unserialize()» میفرستد. این تابع یک شی ذخیرهشده را میگیرد و آن را به یک شی در حافظه تبدیل میکند و بهعنوان یکی از مسائل امنیت PHP امروزه مطرح است.
نتیجهگیری
در این مقاله ما سعی کردیم که امنیت PHP و مسائل و آسیبپذیریهای مربوط به آن را موردبررسی قرار دهیم. بیشتر آسیبپذیریهایی که در PHP مشاهده خواهید کرد یکی از انواع آسیبپذیری بالا خواهند بود. با اینهمه بازهم میتوان گفت که امنیت PHP در سطح نرمالی قرار دارد و هنوز هم یکی از زبانهای پرطرفدار برای توسعه وب است.