امنیت در PHP به مجموعهای از تنظیمات سرور و اصول کدنویسی گفته میشود که برای جلوگیری از دسترسی غیرمجاز هکرها و محافظت از دادههای کاربران اجرا میشود. زبان پیاچپی بهخودیخود آسیبپذیر نیست؛ بلکه عدم اعتبارسنجی ورودیها و استفاده از توابع منسوخشده است که راه را برای نفوذ به پروژهها باز میکند.
در این مقاله، ابتدا رایجترین حملات سایبری به سایتهای پیاچپی (مانند تزریق SQL و XSS) را بررسی میکنیم. سپس بهصورت عملی یاد میگیرید که چگونه با ایمنسازی دیتابیس، فرمها و نشستها (Sessions)، امنیت وبسایت PHP خود را در بالاترین سطح ممکن تأمین کنید.

فهرست مطالب
رایجترین حملات در سایتهای PHP
برای تأمین امنیت در php، ابتدا باید بدانیم مهاجمان از چه مسیرهایی وارد سیستم میشوند. براساس گزارشهای معتبر و مستندات امنیتی توسعهدهندگان وب، چهار روش اصلی برای نفوذ به پروژههای تحت زبان برنامه نویسی php وجود دارد که در ادامه به بررسی آنها میپردازیم.
۱- تزریق پایگاه داده یا SQL Injection
در این نوع حمله، هکر کدهای مخرب SQL را ازطریق فیلدهای ورودی (مثل فرم لاگین یا نوار جستجو) به سمت دیتابیس ارسال میکند. اگر ورودیها بررسی نشوند، سرور این کدهای مخرب را بهعنوان یک دستور معتبر میپذیرد و اجرا میکند. نتیجه این حمله میتواند افشای اطلاعات حساس کاربران، تغییر دادهها یا حتی حذف کامل جداول باشد. برای درک بهتر نحوه کارکرد این بخش حیاتی سرور، پیشنهاد میکنیم مقاله پایگاه داده (Database) چیست؟ را مطالعه کنید.
۲- حملات Cross-Site Scripting (XSS)
حمله XSS زمانی رخ میدهد که یک اسکریپت مخرب (معمولاً جاوا اسکریپت) ازطریق ورودیهای سایت، در مرورگر سایر کاربران اجرا شود. هدف اصلی جلوگیری از تزریق کد در این روش، محافظت از نشستها (Sessions) و کوکیهای کاربران است. هکر با سرقت این اطلاعات میتواند هویت کاربر را جعل کند و بدون نیاز به رمز عبور وارد حساب کاربری او شود. چاپ مستقیم دادههای فیلترنشده در صفحات وب، عامل اصلی این آسیبپذیری است.
۳- جعل درخواست یا Cross-Site Request Forgery (CSRF)
در حمله CSRF، هکر از اعتماد وبسایت شما به مرورگر کاربر سوءاستفاده میکند. اگر کاربری در سایت شما لاگین کرده باشد و همزمان روی یک لینک مخرب در سایتی دیگر کلیک کند، درخواستی ناخواسته (مثل تغییر ایمیل یا انتقال وجه) با هویت همان کاربر به سرور شما ارسال میشود. برای جلوگیری از این نوع حملات، استفاده از توکنهای رمزنگاریشده یکبار مصرف در فرمها کاملاً ضروری است.
اجرای کد از راه دور (Remote Code Execution – RCE)
خطرناکترین سطح دسترسی برای یک هکر، حمله RCE است. در این حالت، مهاجم موفق میشود کدهای مخرب خود را مستقیماً روی سرور میزبان اجرا کند. این اتفاق معمولاً بهدلیل استفاده از توابع خطرناک سیستمعامل (مانند exec یا shell_exec) در کدهای برنامه یا آپلود فایلهای مخرب رخ میدهد. با اجرای RCE، هکر کنترل کامل سرور را در دست میگیرد.
امنیت ورودیها و فرمها در PHP
مهمترین قانون برای حفظ امنیت وب سایت php در یک جمله خلاصه میشود: «هرگز به دادههای کاربر اعتماد نکنید». هر اطلاعاتی که از سمت کاربر ارسال میشود (چه ازطریق فرمها، چه URL و چه کوکیها) باید قبلاز پردازش، کاملاً ایزوله و بررسی شود. امنیت فرمها و ورودیها در PHP به دو بازوی اصلی متکی است:
۱- اعتبارسنجی دادهها
اعتبارسنجی (Validation) بهمعنای بررسی صحت فرمت دادههای ورودی است. در این مرحله ما چک میکنیم که آیا داده ارسال شده، دقیقاً همان ماهیتی را دارد که انتظار داریم یا خیر. بهعنوان مثال، اگر فیلدی برای دریافت سن کاربر طراحی شده، اعتبارسنجی بررسی میکند که آیا مقدار وارد شده فقط شامل اعداد است؟ آیا ایمیل وارد شده ساختار استانداردی دارد؟ اعتبارسنجی اولین سد دفاعی برای اطمینان از صحت منطقی اطلاعات است.
۲- پاکسازی و فیلترکردن
اگر اعتبارسنجی «نوع» داده را بررسی میکند، پاکسازی (Sanitization)، محتوای خطرناک را از داخل دادهها حذف یا خنثی میکند. برای درک بهتر تفاوت این دو، به این مقایسه دقت کنید:
- اعتبارسنجی: بررسی میکند که آیا متن وارد شده شبیه به یک ایمیل است؟
- پاکسازی: تگهای <script> و کاراکترهای خطرناک را از متن کامنت کاربر حذف میکند تا کدی اجرا نشود.
استفاده از تابع Filter_var
برای پیادهسازی اصولی اعتبارسنجی، نیازی به نوشتن توابع پیچیده ندارید. زبان پیاچپی تابع قدرتمند filter_var() را دقیقاً برای همین کار در هسته خود قرار داده است. با استفاده از فیلترهای ازپیشتعریفشده (مانند FILTER_VALIDATE_EMAIL برای تأیید ایمیل یا FILTER_SANITIZE_SPECIAL_CHARS برای خنثی کردن کدهای مخرب)، میتوانید در یک خط کد، جلوی بسیاری از آسیبپذیریهای رایج را بگیرید.
جلوگیری از SQL Injection با Prepared Statements
برای تضمین امنیت در php، یکیاز مهمترین گامها، ایمنسازی نحوه ارتباط اسکریپتها با پایگاه داده است. استفاده از روشهای قدیمی برای دریافت اطلاعات از کاربر و ارسال مستقیم آنها به دیتابیس، دقیقاً همان چیزی است که سایت شما را در معرض حملات تزریق SQL قرار میدهد. بهترین راهکار برای امنسازی اتصال دیتابیس در PHP، استفاده از مفهومی به نام Prepared Statements (پرسوجوهای آماده) است.
تفاوت PDO و MySQLi

سالها پیش، برنامهنویسان از توابعی مانند mysql_query برای اتصال به دیتابیس استفاده میکردند. این توابع بهدلیل ضعفهای امنیتی شدید، کاملاً منسوخ و از هسته PHP حذف شدهاند. امروزه برای جلوگیری از هک سایت PHP، تنها دو انتخاب استاندارد و امن پیش روی شماست: PDO (PHP Data Objects) و MySQLi.
تفاوت اصلی این دو در انعطافپذیری آنهاست:
- پشتیبانی از دیتابیسها: اکستنشن MySQLi فقط برای اتصال به دیتابیسهای MySQL طراحی شده است، درحالیکه PDO از ۱۲ نوع دیتابیس مختلف (مثل PostgreSQL، SQLite و Oracle) پشتیبانی میکند.
- شیءگرایی: هر دو روش از ساختار شیءگرا (OOP) پشتیبانی میکنند، اما MySQLi امکان کدنویسی رویهای (Procedural) را نیز فراهم میکند.
توصیه ما برای پروژههای شما، استفاده از PDO است؛ زیرا درصورت نیاز به تغییر نوع دیتابیس در آینده، نیازی به بازنویسی کل کدهای ارتباطی نخواهید داشت.
نحوه نوشتن پرسوجوهای امن با بایندکردن پارامترها
روش کار Prepared Statements بسیار ساده و در عین حال قدرتمند است. در این ساختار، دستورات SQL و دادههای کاربر بهصورت کاملاً مجزا به سمت سرور دیتابیس ارسال میشوند.
ابتدا ساختار کلی پرسوجو (Query) در دیتابیس کامپایل میشود. سپس دادههای ورودی کاربر صرفاً بهعنوان مقدار (Value) به این ساختار متصل (Bind) میشوند. بهاینترتیب، حتی اگر کاربر کدهای مخرب SQL را در یک فیلد فرم وارد کند، دیتابیس آنها را بهعنوان یک متن ساده پردازش میکند و اجازه اجرای آنها را نمیدهد. بدینترتیب است که روشهای جلوگیری از حملات سایبری در PHP در سطح دیتابیس به مؤثرترین شکل ممکن پیادهسازی میشود.
تنظیمات امنیتی فایل php.ini
بخش بزرگی از آموزش امنیت در php مربوط به کدهایی که مینویسید نیست، بلکه به پیکربندی خود سرور (Server Configuration) برمیگردد. فایل php.ini مهمترین عضو تنظیمات PHP است و تغییرات هدفمند در آن میتواند سد دفاعی بسیار محکمی برای محافظت از سایت PHP ایجاد کند.
۱- غیرفعال کردن نمایش خطاها (display_errors)
در زمان توسعه و دیباگ کدها، نمایش خطاهای PHP روی مرورگر برای برنامهنویس بسیار مفید است. اما در محیط عملیاتی (Production) و سایتی که در دسترس عموم قرار دارد، فعال بودن گزینه display_errors یک اشتباه جبرانناپذیر است.
خطاهای چاپشده روی صفحه میتوانند اطلاعات حساسی مانند مسیر دقیق فایلها روی سرور، نام جداول دیتابیس و منطق درونی کدها را فاش کنند. هکرها از این اطلاعات برای یافتن نقاط ضعف استفاده میکنند. برای حفظ امنیت سایت php، باید نمایش خطاها را خاموش کنید (display_errors = Off) و در عوض، ثبت خطاها در یک فایل گزارش را فعال کنید (log_errors = On).
۲- محدودکردن دسترسی با open_basedir
برای محافظت از فایلها و پوشهها در PHP، باید دسترسی اسکریپتها را محدود کنید. دستور open_basedir در فایل کانفیگ، دقیقاً همین کار را انجام میدهد. با تنظیم این مقدار، به PHP دستور میدهید که اسکریپتها فقط مجاز به خواندن و نوشتن فایلها در همان پوشه مشخصشده (مثلاً دایرکتوری اصلی سایت) هستند. این کار از دسترسی کدهای مخرب به فایلهای حساس سرور (مانند etc/passwd/ در لینوکس) جلوگیری میکند.
۳- بستن توابع خطرناک (disable_functions)
برای امنسازی اسکریپتهای PHP در برابر حملات خطرناکی مثل اجرای کد از راه دور (RCE)، باید دسترسی به توابعی که مستقیماً با سیستمعامل سرور ارتباط برقرار میکنند را مسدود کنید.
توابعی مانند exec، shell_exec، system و passthru به ندرت در روال عادی وبسایتها استفاده میشوند، اما محبوبترین ابزار هکرها برای اجرای دستورات مخرب روی سرور هستند. با اضافهکردن نام این توابع به دایرکتیو disable_functions در فایل php.ini، یک لایه امنیتی قدرتمند به هاست یا سرور مجازی خود اضافه میکنید.
مدیریت امن Session و Cookie
اگر میخواهید بدانید که در لایههای کاربری بهترین روشهای امنیت PHP چیست؟ قطعا یکیاز اولین پاسخها، محافظت از نشستها (Sessions) و کوکیها است. امنیت Session و Cookie در PHP مستقیماً با هویت کاربران شما گره خورده است و کوچکترین اشتباه در این بخش، باعث لو رفتن حساب کاربری افراد میشود. در ادامه با دو راهکار اصلی امنیت در php در مدیریت نشستها آشنا میشویم.
۱- جلوگیری از Session Hijacking (سرقت نشست)
در آموزش امنیت php، حملهی سرقت نشست یا Session Hijacking زمانی رخ میدهد که هکر بتواند شناسه منحصربهفرد نشست (Session ID) یک کاربر تأییدشده را بهدست بیاورد. با داشتن این شناسه، هکر میتواند بدون نیاز به نام کاربری و رمز عبور، خودش را جای کاربر جا بزند.
یکیاز مهمترین نکات امنیتی PHP برای جلوگیری از این اتفاق، تغییردادن مداوم این شناسه است. شما باید در لحظات حساس (بهویژه بلافاصله پساز لاگین موفقیتآمیز کاربر)، با استفاده از تابع session_regenerate_id(true) یک شناسه جدید و کاملاً متفاوت برای او بسازید و شناسه قبلی را باطل کنید. این کار باعث میشود حتی اگر هکر شناسه قبلاز لاگین را دزدیده باشد، آن شناسه دیگر اعتباری نداشته باشد.
۲- تنظیمات امن کوکی (Cookie Flags)
کوکیها فایلهای کوچکی هستند که در مرورگر کاربر ذخیره میشوند. برای جلوگیری از دسترسی غیرمجاز به این فایلها، باید از فلگهای (Flags) امنیتی استفاده کنید:
- فلگ HttpOnly: با فعالکردن این گزینه، جاوااسکریپت نمیتواند محتوای کوکی را بخواند. این فلگ یک سد دفاعی عالی برای جلوگیری از XSS در PHP است؛ زیرا حتی اگر هکر کدهای مخرب JS را در سایت شما تزریق کند، باز هم نمیتواند کوکیهای کاربران را بدزدد.
- فلگ Secure: این گزینه به مرورگر دستور میدهد که کوکی را فقط بر روی بسترهای رمزنگاریشده (HTTPS) ارسال کند و مانع از شنود آن در شبکههای ناامن (مثل وایفایهای عمومی) میشود.
امنیت فایلها و آپلود در PHP
آپلود فایل همیشه یک ریسک بزرگ است. وقتی پای فرمهای آپلود (مثل تصویر پروفایل یا ارسال رزومه) در میان است، بدبینی کامل به فایلهای دریافتی، امنیت سایت شما را تضمین میکند. همچنین رعایت نکات زیر از پایهایترین روشهای امنسازی PHP است و پیادهسازی همین دو مرحله کمک بزرگی به حفظ امنیت در php میکند.
بررسی پسوند و نوع فایل (MIME Type)
تکیهکردن به پسوند ظاهری فایل (مثلاً image.jpg) یکیاز اشتباهات مهلک حفظ امنیت در پی اچ پی است؛ زیرا هکر میتواند نام یک اسکریپت مخرب را بهراحتی تغییر دهد. همچنین بررسی نوع فایل ازطریق متغیر $_FILES[‘userfile’][‘type’] نیز امن نیست، چون این مقدار توسط مرورگر کاربر ارسال میشود و کاملاً قابل جعل است.
برای اطمینان از ماهیت واقعی فایل، باید محتوای باینری آن را در سمت سرور اسکن کنید. بهترین روش برای این کار، استفاده از اکستنشن Fileinfo و تابع finfo_file() در PHP است که ساختار درونی فایل (MIME Type واقعی) را بررسی میکند و مشخص میکند آیا فایل واقعاً یک تصویر استاندارد است یا یک بدافزار در آن پنهان شده است.
تغییر نام فایلهای آپلودی
برای جلوگیری از تزریق کد در PHP ازطریق فرمهای آپلود، هرگز فایل را با نام اصلی خودش روی سرور ذخیره نکنید. اگر یک فایل مخرب با نام shell.php از سدهای قبلی عبور کند و با همین نام ذخیره شود، هکر میداند فایلش دقیقاً در چه مسیری قرار دارد و با صدازدن آن در مرورگر، سرور شما را در دست میگیرد.
راهکار: در زمان ذخیرهسازی، یک نام کاملاً تصادفی و غیرقابل حدس (مثلاً با استفاده از هش کردن یک مقدار یونیک با توابعی مثل bin2hex(random_bytes(16))) تولید کنید و فایل را با این نام جدید در یک پوشه خارج از دسترس مستقیم (بدون قابلیت اجرای اسکریپت) ذخیره کنید.

نکات زیرساختی برای امنیت PHP
تا اینجای مقاله بررسی کردیم که در لایه کدنویسی چه حملاتی سایت PHP را تهدید میکند؟ اما اگر زیرساخت و سرور شما استانداردهای لازم را نداشته باشد، امنترین کدهای دنیا هم آسیبپذیر خواهند بود. در واقع، یکیاز بهترین روشهای افزایش امنیت PHP، ایمنسازی محیطی است که کدهای شما در آن اجرا میشوند.
نقش HTTPS و رمزنگاری دادهها
یکی از پایهایترین روشهای امنسازی PHP، نصب گواهی SSL و فعالسازی پروتکل HTTPS است. این پروتکل، ارتباط بین مرورگر کاربر و سرور شما را رمزنگاری میکند. رمزنگاری دادهها در PHP در بستر شبکه باعث میشود تا اطلاعات حساسی مانند رمزهای عبور، در مسیر انتقال توسط هکرها شنود (Sniffing) نشوند.
اما آیا استفاده از HTTPS کافی است؟ قطعاً خیر. استفاده از HTTPS و امنیت PHP تنها از دادههای درحال انتقال محافظت میکند و هیچگونه مقاومتی در برابر حملاتی مثل تزریق پایگاه داده (SQLi) یا ضعفهای منطقی کدهای شما ایجاد نمیکند.
بهروزرسانی نسخه PHP و کتابخانهها
اگر میپرسید چطور PHP را بدون دانش پیشرفته امن کنیم، سادهترین پاسخ، بهروزرسانی مداوم است. نسخههای قدیمی PHP (مانند سری ۵ یا ۷.۲) دیگر وصلههای امنیتی دریافت نمیکنند و پر از باگهای شناختهشده هستند. ارتقا به جدیدترین نسخههای پایدار (مانند PHP 8.x)، بهطور خودکار بسیاری از حفرههای امنیتی را میبندد. همچنین، همیشه کتابخانههای جانبی (پکیجهای نصبشده با Composer) را آپدیت نگه دارید؛ زیرا هکرها معمولاً از آسیبپذیریِ پلاگینهای قدیمی برای نفوذ استفاده میکنند.
استفاده از فایروال و وبسرویسهای امن
پیکربندی صحیح وبسرورها (مانند Nginx یا آپاچی) لایه مهمی از نکات امنیتی PHP است. استفاده از فایروال برنامههای وب (WAF) میتواند ترافیک مخرب را قبلاز رسیدن به اسکریپتهای شما مسدود کند. WAF الگوهای مشکوک (مثل تلاش برای ارسال دستورات دیتابیس در URL) را شناسایی و دسترسی IP مهاجم را قطع میکند.

چرا هاست اشتراکی برای امنیت PHP سَم است؟
بسیاری از برنامهنویسان میپرسند چطور سایت PHP خود را امن کنیم؟ درحالیکه پروژهشان را روی یک هاست اشتراکی مستقر کردهاند! در هاستهای اشتراکی، شما هیچ دسترسی مستقیمی به تنظیمات ریشه ندارید. نمیتوانید توابع خطرناک را در php.ini غیرفعال کنید، تنظیمات فایروال (WAF) اختصاصی بنویسید، یا از ایزوله بودن منابع خود در برابر سایتهای ویروسیِ همسایه مطمئن شوید.
برای پیادهسازی بالاترین سطح محافظت از سایت PHP، شما به منابع سختافزاری اختصاصی و محیطی کاملاً ایزوله نیاز دارید. با خرید سرور مجازی (VPS) از ابر فردوسی، کنترل کامل سیستمعامل در دستان شماست. برخی از امکاناتی که زیرساخت ما برای برنامهنویسان فراهم کرده است عبارتند از:
- دسترسی Root: برای اعمال دقیقترین کانفیگهای امنیتی روی فایلهای سرور.
- بازارچه ابری (نصب با یک کلیک): راهاندازی اتوماتیک محیطهای امن مانند LAMP، داکر (Docker) و انجینایکس بدون خطای انسانی.
- آنتی تحریم و شبکه امن: دریافت ایمن پکیجها و آپدیتها بدون محدودیت و قطعی.
- پرداخت ساعتی: مقیاسپذیری آنی منابع و پرداخت هزینه فقط بهازای ساعات روشنی سرور.
برای اینکه سرور مجازی دمو را بدون هیچ ریسکی در پروژههای PHP خود تست کنید، همین حالا ثبتنام کنید و ۱۰۰ هزار تومان اعتبار هدیه اولیه برای راهاندازی سرور خود دریافت کنید.
چکلیست نهایی امنیت در پروژههای PHP
پیادهسازی روشهای امنیت در php نیازمند نظم و دقت است. برای اینکه مطمئن شوید هیچ حفرهای در پروژه شما باز نمانده، قبلاز انتقال کدهایتان به سرور اصلی (Deploy)، حتماً این چکلیست کاربردی را مرور کنید:
۱. دیتابیس و اطلاعات
- استفاده از PDO: آیا برای تمام پرسوجوهای دیتابیس از Prepared Statements استفاده کردهاید تا راه بر تزریق SQL بسته شود؟
- سطح دسترسی دیتابیس: آیا کاربری که PHP با آن به دیتابیس متصل میشود، فقط به همان دیتابیس خاص دسترسی دارد (و نه دسترسی Root)؟
- رمزنگاری پسوردها: آیا رمز عبور کاربران با توابع امنی مانند password_hash هش شدهاند (و نه الگوریتمهای منسوخی مثل MD5)؟
۲. مدیریت فرمها و ورودیها
- فیلتر کردن با filter_var: آیا تمام دادههای دریافتی از $_GET و $_POST قبلاز پردازش، اعتبارسنجی و پاکسازی شدهاند؟
- مقابله با XSS: آیا هنگام نمایش اطلاعاتی که کاربر در مرورگر وارد کرده، از توابعی مانند htmlspecialchars استفاده کردهاید؟
- توکن CSRF: آیا در تمام فرمهای حساس (مثل تغییر رمز یا پرداخت)، یک توکن یکبارمصرفِ مخفی برای تأیید هویت فرم قرار دادهاید؟
۳. فایلها و نشستها
- آپلود ایمن: آیا محتوای واقعی (MIME Type) فایلهای آپلودی را با finfo بررسی کردهاید و نام آنها را به یک رشته تصادفی تغییر دادهاید؟
- بازسازی Session: آیا بلافاصله بعداز لاگین موفق کاربر، تابع session_regenerate_id(true) را صدا زدهاید؟
- امنیت کوکیها: آیا فلگهای HttpOnly و Secure برای کوکیهای حاوی اطلاعات حساس فعال هستند؟
۴. پیکربندی سرور
- خاموشکردن خطاها: آیا در فایل php.ini مقدار display_errors روی Off تنظیم شده است؟
- محدودسازی توابع: آیا توابع خطرناک سیستمی (مثل exec و shell_exec) در بخش disable_functions غیرفعال شدهاند؟
- فایلهای حساس: آیا فایلهای پیکربندی (مانند .env یا فایل اتصال دیتابیس) خارج از پوشه public_html قرار دارند تا مستقیماً در مرورگر قابل دسترسی نباشند؟
جمعبندی
تأمین امنیت در php یک اقدام موقتی یا نصب یک قطعه کد آماده نیست؛ بلکه یک طرز تفکر است که باید از اولین خط کدنویسی تا زمان کانفیگ سرور همراه شما باشد. در این مقاله یاد گرفتیم که چطور سایت PHP خود را امن کنیم و دیدیم که با رعایت اصولی مثل اعتبارسنجی ورودیها، استفاده از PDO برای دیتابیس و مدیریت صحیح نشستها، میتوان جلوی خطرناکترین حملات (مانند SQLi و XSS) را گرفت. در نهایت نیز متوجه شدیم که امنترین کدها هم روی یک زیرساخت ضعیف، شکننده هستند و داشتن یک سرور با دسترسی کامل، کلید نهایی امنیت است.
حالا شما بگویید که آیا تابهحال در پروژههای PHP خود با حملات سایبری مواجه شدهاید؟ فکر میکنید جای کدام ترفند یا تجربه امنیتی در این لیست خالی است؟ در بخش نظرات همین صفحه، چالشها و تجربیات خود را با ما و دیگر برنامهنویسان به اشتراک بگذارید.
منابع:
php.net | owasp | book.filter.php | cheatsheetseries | linuxsecurity
سؤالات متداول
آیا استفاده از HTTPS کافی است؟
خیر. فعال کردن HTTPS و نصب گواهی SSL فقط دادهها را در مسیر انتقال بین مرورگر کاربر و سرور رمزنگاری میکند تا کسی نتواند آنها را در میانه راه شنود کند. اما این پروتکل هیچ مقاومتی در برابر کدهای مخرب، آسیبپذیریهای دیتابیس (مثل SQL Injection) یا ضعفهای منطقی برنامه شما ایجاد نمیکند. برای حفظ امنیت سایت php، باید امنیت لایه اپلیکیشن را نیز جدی بگیرید.
چطور PHP را بدون دانش پیشرفته امن کنیم؟
اگر متخصص امنیت نیستید، رعایت همین سه قدم ساده ریسک نفوذ را بهشدت کاهش میدهد:
۱. هسته PHP و تمام کتابخانهها (پکیجهای کامپوزر) را همیشه به آخرین نسخه پایدار آپدیت نگه دارید.
۲. تیک نمایش خطاها (display_errors) را در محیط عملیاتی بردارید.
۳. بهجای کدنویسی از صفر، از فریمورکهای استاندارد (مثل لاراول) استفاده کنید؛ چراکه این ابزارها بسیاری از استانداردهای امنیت وب سایت php را بهصورت پیشفرض درون خود جای دادهاند.
چه حملاتی سایت PHP را تهدید میکند؟
براساس استانداردهای OWASP، خطرناکترین و رایجترین حملات شامل موارد زیر است:
تزریق دستورات به دیتابیس (SQL Injection)
سرقت کوکی و نشست از طریق تزریق اسکریپت در مرورگر (XSS)
جعل درخواستهای کاربر تاییدشده (CSRF)
اجرای کد از راه دور با آپلود فایل مخرب (RCE)
آیا PHP ذاتاً زبان ناامنی است؟
بههیچوجه. PHP یکیاز قدرتمندترین زبانهای سمت سرور است که بخش بزرگی از وب (از جمله وردپرس) را هدایت میکند. آسیبپذیریها معمولاً ناشی از کدنویسی غیراصولی، استفاده از توابع منسوخشده (مثل mysql_query) و از همه مهمتر، اعتمادِ بیجا به دادههایی است که از سمت کاربر ارسال میشود.
آیا استفاده از تابع addslashes() یا mysql_real_escape_string() برای جلوگیری از SQL Injection کافی است؟
این یکیاز بزرگترین باورهای غلط خیلی از برنامهنویسان است! سالها پیش برنامهنویسان برای جلوگیری از هک سایت PHP از این توابع برای خنثیکردن کاراکترهای خطرناک (مثل کوتیشنها) استفاده میکردند. اما امروزه هکرها به راحتی با تغییر انکودینگ (Encoding) کاراکترها، این توابع را دور میزنند. تنها روش قطعی و استاندارد برای امنسازی اتصال دیتابیس در PHP، استفاده از Prepared Statements (توسط PDO یا MySQLi) است.
آیا استفاده از md5 یا sha1 برای ذخیره رمز عبور کاربران امن است؟
خیر، به هیچوجه. باوجوداینکه هنوز هم در بسیاری از آموزشهای قدیمی به این توابع اشاره میشود، اما الگوریتمهای md5 و sha1 بهدلیل سرعت بالای پردازش، بهراحتی توسط حملات Brute Force و جداول رنگینکمانی (Rainbow Tables) هک میشوند. از بهترین روشهای افزایش امنیت PHP برای رمزنگاری دادهها در PHP (مخصوصاً پسوردها)، استفاده از تابع داخلی password_hash() است که از الگوریتمهای قدرتمند و کندی مثل Bcrypt یا Argon2 استفاده میکند.
چطور متوجه شویم هکرها نسخه PHP سایت ما را فهمیدهاند و چطور آن را مخفی کنیم؟
بهصورت پیشفرض، سرور در پاسخهای HTTP (Headers) خود، عبارتی مثل X-Powered-By: PHP/7.4.3 را برای مرورگر ارسال میکند. هکرها با دیدن این هدر، دقیقاً متوجه میشوند که سایت شما از چه نسخهای استفاده میکند و بلافاصله بهدنبال اکسپلویتهای (Exploits) مربوط به همان نسخه میگردند. یکیاز روشهای امنسازی PHP این است که به فایل php.ini بروید و مقدار expose_php را روی Off تنظیم کنید تا نسخه پیاچپی شما کاملاً مخفی بماند.

