فیلتر کردن داده (اعتبارسنجی و پاک سازی) در PHP 7

08 مرداد 1398
درسنامه درس 20 از سری آموزش PHP 7
فیلتر کردن داده (اعتبار سنجی و پاک سازی) در PHP 7

فیلتر کردن داده ها با تابع ()filter_var

در جلسات قبل در رابطه با دو مفهوم اصلی صحبت کردیم:

  • اعتبارسنجی داده (Validating data): بررسی اینکه داده در قالب صحیح باشد.
  • پاکسازی داده (Sanitizing data): بررسی اینکه داده ها دارای کاراکتر های غیر مجاز و کد های مخرب نباشند.

یکی از توابعی که در هر دو زمینه به کمک ما می آید تابع تابع ()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

در مثال زیر می خواهیم ببینیم آیا آدرس 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>

مشاهده ی خروجی

اعتبارسنجی و پاک سازی آدرس Email

در مثال زیر تابع تابع ()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)

دقیقا همان کاری که با آدرس ایمیل کردیم، با آدرس 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>

مشاهده ی خروجی

اعتبارسنجی آدرس IPv6

همانطور که میدانید آدرس 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

در مثال زیر تنها 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

در مثال زیر می خواهیم کاراکترهایی را که از نوع ASCII و کمتر از 127 باشند را حذف کنیم. توجه کنید که منظور ما مقدارِ کدِ ASCII آن ها است نه مقداری عددی آن ها:

جدول کد های کاراکتر های ASCII
جدول کدهای کاراکتر های 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>

مشاهده ی خروجی

امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.