باگ‌های 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