در جلسات قبل در رابطه با دو مفهوم اصلی صحبت کردیم:
یکی از توابعی که در هر دو زمینه به کمک ما می آید تابع تابع ()filter_var در PHP است. این تابع برای بررسی سریع تر داده ها طراحی شده است و می تواند با کدهای پیش فرضی که دارد انواع داده ها را چک کند. لیستی از قابلیت های این تابع را در جدول زیر می بینید:
<!DOCTYPE html> <html> <head> <style> table, th, td { border: 1px solid black; border-collapse: collapse; } th, td { padding: 5px; } </style> </head> <body> <table> <tr> <td>Filter Name</td> <td>Filter ID</td> </tr> <?php foreach (filter_list() as $id =>$filter) { echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>'; } ?> </table> </body> </html>
سوال: چرا از از filter ها استفاده کنیم؟
پاسخ: بسیاری از وب سایت ها و برنامه های تحت وب از یک منبع خارجی داده می گیرند (مثلا فرمی از سمت کاربران ارسال می شود) و این داده ها می توانند شکل های زیر را به خود بگیرند:
شما باید به عنوان یک قانون کلی همیشه این نکته را در ذهن داشته باشید: داده های خارجی همیشه باید اعتبارسنجی و پاک سازی شوند. این داده ها می توانند دارای کد های مخرب یا کاراکترهای غیرمجاز باشند که به نوبه ی خود برای وب سایت شما انواع مشکلات امنیتی و اجرایی را ایجاد می کنند.
تابع تابع ()filter_var در PHP هم داده ها را پاک سازی کرده و هم اعتبارسنجی می کند. این تابع یک متغیر را از طریق یک فیلتر مشخص شده چک می کند بنابراین دو پارامتر می گیرد: اولین پارامتر داده ای است که می خواهید بررسی شود و دومین پارامتر نوع فیلتر اعمال شده خواهد بود.
در کد زیر با استفاده از تابع ()filter_var
می خواهیم یک رشته را پاک سازی کنیم:
<!DOCTYPE html> <html> <body> <?php $str = "<h1>Hello World!</h1>"; $newstr = filter_var($str, FILTER_SANITIZE_STRING); echo $newstr; ?> </body> </html>
مثال زیر با استفاده از تابع ()filter_var در PHP متغیر int را چک می کند تا ببیند آیا int عدد صحیح است یا خیر. اگر عدد صحیح باشد خروجی کد ما Integer is valid می شود و در غیر این صورت پیام Integer is not valid نمایش داده می شود.
<!DOCTYPE html> <html> <body> <?php $int = 100; if (!filter_var($int, FILTER_VALIDATE_INT) === false) { echo("Integer is valid"); } else { echo("Integer is not valid"); } ?> </body> </html>
البته در این مثال مشکلی وجود دارد. اگر مقدار int را برابر با صفر قرار دهیم تابع ما پیام Integer is not valid (عدد صحیح نیست) را نمایش می دهد. برای حل این مشکل می توانید کد را به این شکل بنویسید:
<!DOCTYPE html> <html> <body> <?php $int = 0; if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) { echo("Integer is valid"); } else { echo("Integer is not valid"); } ?> </body> </html>
در مثال زیر می خواهیم ببینیم آیا آدرس IP ارائه شده معتبر است یا خیر:
<!DOCTYPE html> <html> <body> <?php $ip = "127.0.0.1"; if (!filter_var($ip, FILTER_VALIDATE_IP) === false) { echo("$ip is a valid IP address"); } else { echo("$ip is not a valid IP address"); } ?> </body> </html>
در مثال زیر تابع تابع ()filter_var در PHP ابتدا کاراکترهای غیرقانونی را از آدرس ایمیل حذف می کند، سپس قالب کلی این آدرس را بررسی می کند تا از معتبر بودن آن اطمینان پیدا کند:
<!DOCTYPE html> <html> <body> <?php $email = "john.doe@example.com"; // Remove all illegal characters from email $email = filter_var($email, FILTER_SANITIZE_EMAIL); // Validate e-mail if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { echo("$email is a valid email address"); } else { echo("$email is not a valid email address"); } ?> </body> </html>
دقیقا همان کاری که با آدرس ایمیل کردیم، با آدرس URL زیر نیز انجام می دهیم:
<!DOCTYPE html> <html> <body> <?php $url = "https://www.w3schools.com"; // Remove all illegal characters from a url $url = filter_var($url, FILTER_SANITIZE_URL); // Validate url if (!filter_var($url, FILTER_VALIDATE_URL) === false) { echo("$url is a valid URL"); } else { echo("$url is not a valid URL"); } ?> </body> </html>
در مثال زیر کار تابع ()filter_var
بررسی دو مورد است: ابتدا باید ببینیم نوع عدد INT (عدد صحیح) باشد، سپس باید مطمئن شویم عدد ما بین 1 تا 200 است:
<!DOCTYPE html> <html> <body> <?php /* variable to check */ $int = 122; /* min value */ $min = 1; /* max value */ $max = 200; if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) { echo("Variable value is not within the legal range"); } else { echo("Variable value is within the legal range"); } ?> </body> </html>
همانطور که میدانید آدرس IPv4 با IPv6 متفاوت است بنابراین اگر بخواهیم آدرس های IPv6 را بررسی کنیم می گوییم:
<!DOCTYPE html> <html> <body> <?php // Variable to check $ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334"; // Validate ip as IPv6 if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) { echo("$ip is a valid IPv6 address"); } else { echo("$ip is not a valid IPv6 address"); } ?> </body> </html>
در مثال زیر تنها URL هایی را قبول می کنیم که querystring داشته باشند:
<!DOCTYPE html> <html> <body> <?php // Variable to check $url = "https://www.w3schools.com"; // Validate url if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) { echo("$url is a valid URL with a query string"); } else { echo("$url is not a valid URL with a query string"); } ?> </body> </html>
در مثال زیر می خواهیم کاراکترهایی را که از نوع ASCII و کمتر از 127 باشند را حذف کنیم. توجه کنید که منظور ما مقدارِ کدِ ASCII آن ها است نه مقداری عددی آن ها:
<!DOCTYPE html> <html> <body> <?php // Variable to check $str = "<h1>Hello WorldÆØÅ!</h1>"; // Remove HTML tags and all characters with ASCII value > 127 $newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); echo $newstr; ?> </body> </html>
امیدوارم از این قسمت لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.