Php 简明教程

PHP - Sanitize Input

在 PHP 中,重要的是要确保在服务器端代码处理输入数据之前,通过删除任何不需要的字符来正确清理输入数据。通常,用户通过 HTML 表单向 PHP Web 应用程序输入其数据。如果表单数据包含任何不需要的字符,可能会造成损害,因此必须执行适当的清理操作。

输入清理可以使用 PHP 中以下一个或多个函数的帮助进行。

The htmlspecialchars() Function

此函数将特殊字符转换为 HTML 实体。

htmlspecialchars(
   string $string,
   int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
   ?string $encoding = null,
   bool $double_encode = true
): string

在 HTML 中,某些字符有着特殊的意义。这个 htmlspecialchars() 函数用于对 HTML 实体中的特殊字符进行编码。当您希望将用户输入显示为 HTML 时,这将非常有用,而且希望防止脚本注入攻击。

以下 special characters 按下述所示方式翻译 −

Character

Replaced by

& (ampersand)

&

" (double quote)

", unless ENT_NOQUOTES is set

' (single quote)

' (for ENT_HTML401 ) or ' (for ENT_XML1, ENT_XHTML or ENT_HTML5 ), but only when ENT_QUOTES is set

< (less than)

<

> (greater than)

>

Flag Constants

flags 参数是一个或多个以下标志的位掩码,它们指定如何处理引号、无效的代码单元序列和使用的文档类型。

Sr.No

Constant & Description

1

ENT_COMPAT 将转换双引号,而忽略单引号。

2

ENT_QUOTES 将转换双引号和单引号。

3

ENT_NOQUOTES 将保留双引号和单引号不变。

4

ENT_IGNORE 舍弃无效的代码单元序列,而不是返回一个空字符串。

5

ENT_SUBSTITUTE 用 Unicode Replacement Character U+FFFD (UTF-8) 或 � 替换无效的代码单元序列

6

ENT_DISALLOWED 用 Unicode Replacement Character U+FFFD (UTF-8) 或 �(否则)替换给定文档类型的无效代码点,而不是保持原样。这可能会很有用。

7

ENT_HTML401 将代码作为 HTML 4.01 处理。

8

ENT_XML1 将代码作为 XML 1 处理。

9

ENT_XHTML Handle code as XHTML.

10

ENT_HTML5 将代码作为 HTML 5 处理。

Example

请看以下示例:

<?php
   $str = 'Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>';
   echo htmlspecialchars($str);
?>

它将生成以下 output

Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>

The strip_tags() Function

strip_tags() 函数从给定的字符串中删除所有 HTML 和 PHP 标记。

strip_tags(string $string, array|string|null $allowed_tags = null): string

当您希望确保用户输入不包含任何潜在的恶意标记时,这个函数非常有用。

allowed_tags 参数是一个可选的第二个参数,用于指定不应删除的标记。这些标记可以以字符串的形式给出,也可以作为数组给出。

Example

请看以下示例:

<?php
   $text = '<p>Hello World</p><!-- Comment -->
      <a href="/test.html">Click Here</a>';
   echo strip_tags($text);
   echo "\n";

   // Allow <p> and <a>
   echo strip_tags($text, '<p><a>');
?>

它将生成以下 output

Hello World
      Click Here
Hello World


      Click Here

The addslashes() Function

addslashes() 函数向字符串添加反斜杠。

addslashes(string $string): string

此函数返回一个字符串,在需要转义的字符前面添加反斜杠。这些字符为 −

  1. Single Quote (')

  2. Double Quote (")

  3. Backslash (\)

  4. NUL (The NUL Byte)

在向数据库中存储用户输入且希望防止 SQL 注入攻击时,请使用此函数。

Example

请看以下示例:

<?php
   $text = "Newton's Laws";
   $str = addslashes($text);

   // prints the escaped string
   echo($str);
?>

它将生成以下 output

Newton\'s Laws

The filter_var() Function

借助特定的过滤器标记,可以使用 filter_var() 函数来净化用户输入。

filter_var(mixed $value, int $filter =
   FILTER_DEFAULT, array|int $options = 0): mixed

$value 参数是要净化其值的一个变量。$filter 参数是任何预定义的过滤器常量。

Sr.No

ID & Description

1

FILTER_SANITIZE_EMAIL 移除除字母数字和 !#$%&'*+-=?^_`{ 之外的所有字符。

}~@.[].

2

FILTER_SANITIZE_ENCODED URL 编码字符串,可以选择清除或编码特殊字符。

3

FILTER_SANITIZE_ADD_SLASHES 应用 addslashes()。(在 PHP 7.3.0 及以上版本中可用)。

4

FILTER_SANITIZE_NUMBER_FLOAT 移除除数字、+- 和选择性地移除 .,eE 之外的所有字符。

5

FILTER_SANITIZE_NUMBER_INT 移除除数字、加号和减号之外的所有字符。

6

FILTER_SANITIZE_SPECIAL_CHARS HTML 编码 '"<>& 字符和 ASCII 值小于 32 的字符,可以选择清除或编码其他特殊字符。

7

FILTER_SANITIZE_FULL_SPECIAL_CHARS 等同于用已设置的 ENT_QUOTES 调用 htmlspecialchars()。通过设置 FILTER_FLAG_NO_ ENCODE_QUOTES 可以禁用编码引号。

8

FILTER_SANITIZE_URL 移除除字母数字和 $-_.+!*'(),{} 之外的所有字符。

\\^~[]`<>#%";/?:@&=.

9

FILTER_UNSAFE_RAW

Example

下列代码展示了净化电子邮件数据的方式 -

<?php
   $a = 'abc def@xyz.com';

   $sa = filter_var($a, FILTER_SANITIZE_EMAIL);
   echo "$sa";
?>

它将生成以下 output

abcdef@xyz.com

Example

下列代码展示了净化 URL 的方式 -

<?php
   $a = "http://example.c o m";

   $sa = filter_var($a, FILTER_SANITIZE_URL);
   echo "$sa";
?>

它将生成以下 output

http://example.com