چند نکته‌ی امنیتی برای اپلیکیشن‌های پی‌اچ‌پی

بر خلاف تصوری که بسیاری از زبان PHP دارند، هنوز هم این زبان یک ابزار کارآمد برای ساخت اپلیکیشن‌های وب به شمار می‌رود. در این پست درباره‌ی نکاتی که می‌توانند به امن‌تر شدن وب‌سایت شما کمک کنند گفتگو می‌کنیم.

روتِ وبِ خود را به فایل index و assetها محدود کنید!

در پی‌اچ‌پی مدرن، فایل index.php که دروازه‌ی ورود به اپلیکیشن شماست را به علاوه‌ی فایل‌های asset در روت قرار می‌دهید؛ فایل index.php پکیج‌های Composer را لود می‌کند و پس از آن به اجرای کدهای شما برای رسیدن به نتیجه‌ی مورد نظر می‌پردازد. فایل‌های config و مواردی از این قبیل نباید در این قسمت وجود داشته باشند و تنها فایل‌های ایستا (static) را در این محل قرار دهید.

مترجم: ساختار پروژه‌ی لاراولی به همین شکل است؛ فایل index.php در public قرار دارد و پکیج‌ها و اپلیکیشنی که توسعه‌دهنده نوشته، همگی از دایرکتوری پیش از public لود می‌شوند.

نمایش خطاها را غیر فعال کنید!

در php.ini می‌توان با display_errors، پی‌اچ‌پی را وادار کرد تا خطاهایی که در حین اجرا رخ می‌دهند را نمایش دهد. خطاهای نشان‌داده‌شده می‌توانند حاوی اطلاعات محرمانه و کوئری‌های دیتابیس باشند که دیدن آنها توسط کاربران می‌تواند خطرناک باشد و امنیت وب‌سایت را تهدید کند، پس در حالت production باید غیر فعال باشند.

در فایل php.ini، به تنظیم این قابلیت به صورت زیر بپردازید:

display_errors = Off 
display_startup_errors = Off

اما خطاها را از کجا بفهمیم؟ می‌توانید به شکل زیر عمل کنید:

log_errors = 1
error_log = /var/log/php-error.log

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

مترجم: در فریم‌ورک لاراول، گزینه‌ی APP_DEBUG در فایل env. مسئول این بخش است و اگر فعال باشد، کدهای شما هم قابل رؤیت هستند!

از password_hash استفاده کنید!

هرگز کلمات عبور کاربران را همانطور که هستند، در دیتابیس ذخیره نکنید و در بعضی مقالات هم توصیه کرده‌اند که از md5 یا hash استفاده کنید، که این‌ها هم نباید استفاده شوند! در پی‌اچ‌پی از تابع password_hash برای هش‌کردن کلمات عبور استفاده می‌کنیم:

<?php
$hash = password_hash('iamapassword', PASSWORD_DEFAULT);
if (password_verify('iamapassword', $hash)) {
   echo "The hash matches!\n"
}

تابع password_hash یک رشته و یک الگوریتم (که PASSWORD_DEFAULT بهترین گزینه است) را می‌گیرد و کلمه‌ی عبور هش‌شده را برمی‌گرداند که بعداً در هنگام ورود کاربر، با فانکشن password_verify به بررسی و تطبیق آن می‌پردازیم و آن هم یک مقدار بولی (True یا False) را برمی‌گرداند و به این صورت از درستی کلمه‌ی عبوری که کاربر برای یک نام کاربری وارد کرده است، مطلع می‌شوید.

تمام ارتباطات را رمزگذاری کنید!

در اپلیکیشن پی‌اچ‌پی شما، ارتباطاتی با دیگر سرویس‌ها وجود دارد که می‌بایست رمزگذاری شود. وقتی از curl یا soap استفاده می‌کنید، https را فراموش نکنید تا از رمزگذاری اطلاعات رد و بدل شده مطمئن باشید. همچنین اگر از FTP استفاده می‌کنید، از یک فرم مطمئن مانند FTPS یا SFTP استفاده کنید.

از فریم‌ورک‌های قالب استفاده کنید!

همانطور که می‌دانید، کدهای PHP می‌توانند کدهای HTML را در درون خود داشته باشند، اما در حالت پیشفرض به بررسی خروجی‌ها نمی‌پردازد. اگر یکی از خروجی‌ها حاوی یک کد مخرب جاوااسکریپت باشد، در صفحه اجرا می‌شود و این می‌تواند امنیت کاربران و حتی مدیران را به خطر بیندازد! راه حل، استفاده از یک موتور قالب مانند Twig است که به طور خودکار به بررسی و پاکسازی خروجی‌ها می‌پردازد و دیگر فراموشی شما، حادثه‌ساز نخواهد شد!

مترجم: لاراول از موتور قالبی به نام Blade استفاده می‌کند و دیگر نیازی به استفاده از Twig و موتورهای قالب دیگر نخواهید داشت. کد زیر نشان می‌دهد که چگونه عمل پاکسازی خروجی را انجام دهیم دهیم و چطور گاهی از آن چشم‌پوشی کنیم:

<h2>{{ $title }}</h2>
<h2>{!! $title !!}</h2>

پیشنهاد می‌کنم که پست با htmlspecialchars انجام دهید و ندهید! را هم مطالعه کنید.


آنچه خواندید، ترجمه‌ای از مقاله‌ی زیر بود:

https://dev.to/restoreddev/security-tips-for-a-php-application-4e9a