باگهای PHP شماره ۲۱ تا ۳۰: اشتباهات رایج
PHP به شما اجازه میدهد بدون هشدار مرتکب اشتباه شوید. این زبان اغلب حتی زمانی که چیزی با شکست مواجه میشود، به اجرای خود ادامه میدهد. این امر منجر به فساد بیصدای دادهها یا ایجاد حفرههای امنیتی میشود.
در اینجا ۱۰ باگ حیاتی که باید از آنها اجتناب کرد آورده شده است:
متنهای چندبایتی (Multibyte Text) تابع
strlen()بایتها را میشمارد، نه کاراکترها را. این موضوع باعث خراب شدن متنهای هندی یا ایموجیها میشود. به جای آن ازmb_strlen()استفاده کنید.فراخوانیهای API بدون اعتبارسنجی تابع
file_get_contents()میتواند بیصدا با شکست مواجه شود. تابعjson_decode()میتواندnullبرگرداند. همیشه بررسی کنید که آیا پاسخfalseاست وjson_last_error()را تأیید کنید.کوکیهای موقت استفاده از
setcookie()بدون تاریخ انقضا باعث میشود کوکی هنگام بستن مرورگر حذف شود. یک زمان انقضا تعیین کنید و از پرچمhttponlyبرای جلوگیری از حملات XSS استفاده کنید.آپلود فایل ناامن بررسی پسوند فایل کافی نیست. هکرها ممکن است
shell.phpرا بهshell.jpgتغییر نام دهند. ازfinfo_file()برای بررسی نوع واقعی MIME استفاده کنید.محاسبات ریاضی با رشتههای فرمتشده PHP خواندن اعداد را در محل ویرگول متوقف میکند. مثلاً "1,299.00" تبدیل به ۱ میشود. قبل از محاسبه، ویرگولها را با
str_replace()حذف کنید. اعداد خام را در پایگاه داده خود ذخیره کنید.ویژگیهای استاتیک مشترک (Shared Static Properties) ویژگیهای استاتیک متعلق به کلاس هستند، نه شیء. هر نمونه (instance) از دادههای یکسانی استفاده میکند. برای دادههای مربوط به هر کاربر، از ویژگیهای عمومی (public properties) معمولی استفاده کنید.
ریدایرکت بدون خروج دستور
header("Location: ...")فقط یک دستور به مرورگر میفرستد. سرور همچنان به اجرای اسکریپت ادامه میدهد. همیشه بعد از ریدایرکت، تابعexit()را فراخوانی کنید.تزریق SQL (SQL Injection) قرار دادن مستقیم متغیرها در رشتههای کوئری به هکرها اجازه میدهد پایگاه داده شما را کنترل کنند. از دستورات آماده (prepared statements) با PDO استفاده کنید.
کرش کردن حافظه تابع
file_get_contents()کل فایلها را در RAM بارگذاری میکند. این کار در فایلهای حجیم باعث از کار افتادن سرور شما میشود. ازfopen()وfgets()برای خواندن خط به خط فایلها استفاده کنید.خطاهای بیصدای پایگاه داده PDO به طور پیشفرض بیصدا عمل میکند. خطاها به جای پرتاب کردن استثنا (exception)، مقدار
falseرا برمیگردانند. مقدارPDO::ATTR_ERRMODEرا برابر باPDO::ERRMODE_EXCEPTIONقرار دهید.
راه حل ساده است: صریح باشید. هر مقدار بازگشتی را بررسی کنید. هر ورودی را اعتبارسنجی کنید. هرگز فرض نکنید که یک تابع با موفقیت اجرا شده است.
مقاله کامل: https://dev.to/bikkisingh/php-bugs-21-to-30-common-mistakes-every-php-developer-must-knowpublished-5hbp