رفع مشکل Exceptions\BadRequestException: The URI you submitted has disallowed characters در Codeigniter4
اگر در حین کار با codeigniter4 در بخش لاگهای سایت خود با خطای CodeIgniter\HTTP\Exceptions\BadRequestException: The URI you submitted has disallowed characters مواجه شدهاید در این نوشته به روش حل آن میپردازیم.
رفع مشکل Exceptions\BadRequestException: The URI you submitted has disallowed characters در Codeigniter4
برای رفع این مشکل میتوانید به فایل app/Config/App.php بروید و کاراکتری که با آن به خطا میخوریم را در متغیر $permittedURIChars قرار دهید. اما دقت کنید این موضوع ممکن است خطرات امنیتی خاصی را برای شما ایجاد کند اگر مایل هستید در صورت استفاده از این کاراکتر کاربر صفحه 404 را ببیند به مسیر public/index.php بروید و قبل از Boot سیستم قطعه کد زیر را درون این فایل قرار دهید:
$requestUri = $_SERVER['REQUEST_URI'] ?? '';
$requestPath = parse_url($requestUri, PHP_URL_PATH) ?? '';
if (strpos($requestPath, '@') !== false) {
header("HTTP/1.1 404 Not Found");
exit('Not Found');
}
مثلا در کد بالا خطای ما با کاراکتر @ بود که با قطعه کد بالا خطای ۴۰۴ را کاربر میبیند.
اگر سوالات بیشتری در ارتباط با فریمورک کدایگنایتر دارید در بخش نظرات این نوشته برای ما بنویسید.



















چطور بفهمم دقیقاً چه کاراکتری باعث شده این خطا رخ بده؟
برای عیبیابی دقیقتر، میتوانید در لحظه بروز خطا، $requestUri را در یک فایل لاگ جداگانه ثبت (Log) کنید تا دقیقاً ببینید کدام کاراکتر غیرمجاز باعث ریجکت شدن درخواست شده است.
گذاشتن این کدهای شرطی در ابتدای index.php روی سرعت سایت تاثیر منفی نداره؟
تاثیر آن در حد چند میکروثانیه است و تقریباً نادیده گرفتنی است. در واقع، این کار با متوقف کردن درخواستهای نامعتبر در همان لحظات اول، حتی میتواند از پردازشهای سنگینترِ فریمورک جلوگیری کند و به نفع سایت است.
من با کاراکترهای فارسی توی آدرسها مشکل دارم، آیا این خطا مربوط به اونها هم میشه؟
بله، اگر کاراکترهای فارسی در آدرسدهی شما غیرمجاز شناخته شوند، این خطا رخ میدهد. اما قبل از تغییر $permittedURIChars مطمئن شوید که انکودینگ (Encoding) سایت شما روی UTF-8 تنظیم شده باشد.
چرا بهتره این کد رو توی public/index.php بذاریم و نه توی فایلهای دیگه مثل کنترلرها؟
چون این خطا قبل از رسیدن درخواست به هسته اصلی و روتهای (Routes) اپلیکیشن رخ میدهد. اگر در کنترلر بگذارید، ممکن است خیلی دیر باشد و سیستم اجازه پردازش درخواست را ندهد.
استفاده از متغیر $permittedURIChars در فایل تنظیمات، دقیقاً چه ریسکهای امنیتی برای سایت ایجاد می کنه؟
باز کردن دسترسی به کاراکترهای خاص در URI میتواند راه را برای حملاتی مثل XSS یا تزریق کدهای مخرب باز کند. به همین دلیل همیشه توصیه میشود به جای تغییر تنظیمات سراسری، در صورت امکان از راههای جایگزین مثل کد ۴۰۴ استفاده کنید.