پالایه‌های فیلتر (Filter) در PHP

فیلترهای PHP برای تأیید و فیلترسازی داده‌هایی که از منابع غیر امن می‌آیند استفاده می‌شوند، مانند ورودی‌های کاربر.

فیلترهای PHP چیست؟

فیلترهای PHP برای تأیید و فیلترسازی داده‌هایی که از منابع غیر امن می‌آیند استفاده می‌شوند.

تأیید و فیلترسازی ورودی‌های کاربران یا داده‌های سفارشی بخش مهمی از هر برنامه وب است.

هدف طراحی افزونه‌های فیلتر PHP این است که فرآیند فیلترسازی داده‌ها آسان‌تر و سریع‌تر شود.

چرا از فیلتر استفاده می‌کنیم؟

تقریباً همه برنامه‌های وب به ورودی‌های خارجی وابسته‌اند. این داده‌ها معمولاً از کاربران یا برنامه‌های دیگر (مانند خدمات وب) می‌آیند. با استفاده از فیلترها، شما می‌توانید اطمینان حاصل کنید که برنامه‌ها ورودی‌های صحیحی دریافت می‌کنند.

您应该始终对外部数据进行过滤!

输入过滤是最重要的应用程序安全课题之一。

什么是外部数据?

  • 来自表单的输入数据
  • Cookies
  • 服务器变量
  • 数据库查询结果

函数和过滤器

如需过滤变量,请使用下面的过滤器函数之一:

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

在下面的例子中,我们用 filter_var() 函数验证了一个整数:

<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
 {
 echo(٢لیر داسشاسش هلجنم);
 }
else
 {
 echo(٢لیر داسشاسشه);
 }
?>

上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,因此代码的输出是:"Integer is valid"。

假如我们尝试使用一个非整数的变量,则输出是:"Integer is not valid"。

如需完整的函数和过滤器列表,请访问我们的 دستورالعمل فیلتر PHP

Validating 和 Sanitizing

有两种过滤器:

Validating 过滤器:

  • 用于验证用户输入
  • 严格的格式规则(比如 URL 或 E-Mail 验证)
  • 如果成功则返回预期的类型,如果失败则返回 FALSE

Sanitizing 过滤器:

  • 用于允许或禁止字符串中指定的字符
  • 无数据格式规则
  • 始终返回字符串

选项和标志

选项和标志用于向指定的过滤器添加额外的过滤选项。

不同的过滤器有不同的选项和标志。

سلما منان جلؠل نلؠل سلما نلؠل ال filter_var() تل منان ال "min_range" تل منان ال "max_range" تل ال للالاسلم الداسشاسش الداسشاسش الجنم;

<?php
$var=300;
$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo(٢لیر داسشاسش هلجنم);
 }
else
 {
 echo(٢لیر داسشاسشه);
 }
?>

مانند کد بالا، گزینه‌ها باید در یک آرایه به نام "options" قرار گیرند. اگر از نشانگر استفاده می‌کنید، نیازی به قرار دادن در آرایه نیست.

چون عدد "300" است، در محدوده مشخص شده نیست، خروجی کد بالا "عدد معتبر نیست" خواهد بود.

برای لیست کامل توابع و فیلترها، لطفاً به CodeW3C.com مراجعه کنید که توسط آن ارائه شده است دستورالعمل فیلتر PHPشما می‌توانید گزینه‌های قابل استفاده و نشانگرهای فیلتر را ببینید.

بررسی ورودی

بیایید سعی کنیم ورودی‌های فرم را بررسی کنیم.

اولین کاری که باید انجام دهیم این است که مطمئن شویم داده‌های ورودی مورد نظر ما وجود دارد.

سپس ما از تابع filter_input() برای فیلتر کردن داده‌های ورودی استفاده می‌کنیم.

در مثال زیر، متغیر ورودی "email" به صفحه PHP ارسال شده است:

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("نوع ورودی وجود ندارد");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "ایمیل معتبر نیست";
  }
 else
  {
  echo "ایمیل معتبر است";
  }
 }
?>

Example Explanation:

در مثال بالا یک متغیر ورودی (email) از طریق روش "GET" ارسال شده است:

  1. بررسی کنید که آیا متغیر ورودی "email" نوع "GET" وجود دارد
  2. اگر متغیر ورودی وجود داشته باشد، بررسی کنید که آیا آدرس ایمیل معتبر است

پاکسازی ورودی

بیایید سعی کنیم URL‌ای که از فرم ارسال شده است را پاکسازی کنیم.

ابتدا باید مطمئن شویم که داده‌های ورودی مورد نظر ما وجود دارد.

سپس، ما از تابع filter_input() برای پاکسازی داده‌های ورودی استفاده می‌کنیم.

در مثال زیر، متغیر ورودی "url" به صفحه PHP ارسال شده است:

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("نوع ورودی وجود ندارد");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

Example Explanation:

در مثال بالا یک متغیر ورودی (url) از طریق روش "POST" ارسال شده است:

  1. بررسی کنید که آیا متغیر ورودی "url" نوع "POST" وجود دارد
  2. اگر این متغیر ورودی وجود داشته باشد، آن را پاکسازی کنید (حذف کاراکترهای غیرقانونی) و در متغیر $url ذخیره کنید

اگر متغیر ورودی مانند این باشد: "http://www.W3非法ol.com.c字符n/"، پس متغیر پاکسازی شده $url باید به این شکل باشد:

http://www.codew3c.com/

فیلتر کردن ورودی‌های چندگانه

فرم‌ها معمولاً از چندین فیلد ورودی تشکیل شده‌اند. برای جلوگیری از فراخوانی مکرر filter_var یا filter_input، می‌توان از filter_var_array یا filter_input_array استفاده کرد.

در این مثال از تابع filter_input_array() برای فیلتر کردن سه متغیر GET استفاده می‌کنیم. متغیرهای GET دریافت شده یک نام، یک سن و یک آدرس ایمیل هستند:

<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
 {
 echo("سن باید عددی بین 1 و 120 باشد.<br />");
 }
elseif (!$result["email"])
 {
 echo("ایمیل معتبر نیست.<br />");
 }
else
 {
 echo("ورودی کاربر معتبر است");
 }
?>

Example Explanation:

در مثال بالا سه متغیر ورودی با روش "GET" ارسال شده‌اند (name، age و email)

  1. یک آرایه تنظیم می‌شود که شامل نام متغیرهای ورودی و فیلترهای مورد استفاده برای ورودی‌های مشخص شده است.
  2. توابع filter_input_array() با پارامترهای GET ورودی و آرایه‌ای که قبلاً تنظیم شده است، فراخوانی می‌شود.
  3. مقادیر "age" و "email" متغیر $result را بررسی می‌کند که آیا ورودی‌های غیرقانونی دارند. (اگر ورودی‌های غیرقانونی وجود داشته باشد،)

دومین پارامتر تابع filter_input_array() می‌تواند یک آرایه یا یک شناسه فیلتر واحد باشد.

اگر این پارامتر یک شناسه فیلتر واحد باشد، این فیلتر مشخص شده همه مقادیر آرایه ورودی را فیلتر خواهد کرد.

اگر این پارامتر یک آرایه باشد، این آرایه باید از قوانین زیر پیروی کند:

  • It must be an associative array containing the input variables as the keys of the array (for example, the "age" input variable)
  • The value of this array must be the ID of the filter, or an array that specifies the filter, flags, and options

Using Filter Callback

By using the FILTER_CALLBACK filter, you can call a custom function and use it as a filter. In this way, we have complete control over data filtering.

You can create your own custom functions or use existing PHP functions.

Specify the method you want to use for filter functions, just like specifying options.

In the following example, we use a custom function to convert all "_" to spaces:

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

The result of the above code is as follows:

Peter is a great guy!

Example Explanation:

The above example converts all "_" to spaces:

  1. Create a function that replaces "_" with a space
  2. Call the filter_var() function, its parameters are FILTER_CALLBACK filter and an array containing our function