فیلتر کردن متغیر و اعتبارسنجی کد در PHP
یکی از نقاط مشترک در بیشتر برنامههای کاربردی تحت وب، فُرمها است. به فرمها برای تعامل با کاربر نیاز داریم. کاربران دادهها را در فرمها وارد میکنند و ما میتوانیم برحسب نیاز بر دادههای آنها کار کنیم و احتمالاً آنها را در یک ذخیرهگاه دادهها ذخیره کنیم.
هرچند از دادههای فرمها در برنامه کاربردی استفاده میکنیم، شکی نیست که هیچوقت نمیتوانیم کاملاً به دادههای فرمها اعتماد کنیم. کاربر ممکن است هر چیزی را وارد فرم کند، ازجمله دادههایی که بالقوه مضر هستند (چه با قصد کاربر و چه بدون اطلاع از مضر بودن). اگر کاربر آدرس ایمیلی را وارد کند که درست ساخته نشده، شاید ایمیلهای تبلیغی شما را نگیرد یا نتواند که کلمه عبور را مجدداً تعیین کند.
بدتر از آن ممکن است که دادههای پرخطری را وارد فرم کند که دادههای سایر کاربران شما را آشکار کند، یا سایت را از کار بیندازد، یا حتی بدتر از آن.
یک اصل مهم: هیچگاه نباید به دادههای یک فرم اعتماد کنیم و انتظار داشته باشیم همان چیزی باشد که میخواهیم. اینجاست که اعتبارسنجی فرم به داد ما میرسد.
میتوان اعتبار فرم را به راههای مختلفی سنجید. در ادامه نمونهای از فیلترینگ متغیرها را مشاهده میکنید؛ بررسی میکنیم آیا یک متغیر در Interactive Shell همان نوع دادهای است که میخواهیم؟
برای شروع، یک پایانه (ترمینال) در رایانه یا دستگاهی که PHP بر آن نصب است باز کنید. اگر آن را بر دستگاه محلی خود دارید، میتوانید این فرمان را اجرا کنید:
php -a
اگر از محیط توسعهی Docker استفاده میکنید، برای اجرای دستور PHP -a از exec با docker-composeto استفاده کنید.
docker-compose exec php php -a
هر دو متد باید شما را به یک Interactive Shell بیاورد، که اینگونه است:
Interactive mode enabled
php >
از اینجا میتوانید متغیری به نام $url را بسازید و آن را برابر با رشتهی ‘http://codeschool.com/’ قرار بدهید:
php > $url = ”;
حتی در Interactive Shell باید تمام خطوط را با «;» به پایان برسانید تا برای shell معلوم کنید خط را به پایان رساندید. در غیر این صورت مفسر انتظار یک عبارت چندخطی را دارد.
با اکو کردن متغیر(echoning) میتوانیم مطمئن میشویم متغیر همان چیزی است که انتظار داریم:
php > echo $url;
برای تست یک متغیر، از یک تابع توکار PHP با نام filter_var استفاده میکنیم. این تابع دو آرگومان را میگیرد: اولی متغیری است که قرار است فیلتر شود، و دومی فیلتری است که قرار است تست کند.
برای تست URL خود با filter_var متن زیر را وارد میکنیم:
php > echo filter_var($url, FILTER_VALIDATE_URL);
یک echo در جلوی filter_var اضافه کردیم تا نتیجه تابع را ببینیم. اگر متغیر فیلترشده درست باشد، تابع، مقدار متغیر را برمیگرداند؛ در غیر این صورت بولیَن (boolean) نادرستی را بازمیگرداند.
حال متغیر را نامعتبر کنیم و کد را دوباره اجرا کنیم؛ به دلیل اینکه echowill به ما یک مقدار غلط را نشان نمیدهد، باید فیلتر را خطبهخط، بهجای echo در یک var_dump مرور کنیم.
php > $url = ‘not a valid url’;
php > var_dump( filter_var($url, FILTER_VALIDATE_URL) );
bool(false)
حال که میدانیم در صورت خطا یک بولین نادرست و در صورت عبور، مقدار واقعی را میگیریم، میتوانیم از عبارت شرطی زیر استفاده کنیم!
php > if( filter_var($url, FILTER_VALIDATE_URL) === false ) {
php { echo ‘The url you entered is not valid, please try again.’;
php { }
The url you entered is not valid, please try again
در اینجا از یک عبارت چندخطی در Interactive Shell استفاده شد. توجه شود که < را به { تغییر دادیم تا نشان دهد درون ساختار کنترلی، کجا هستیم.
امیدواریم از این چاشنی کوچک در فیلترینگ PHP لذت برده باشید.