PHP - 输入处理


PHP 重要的是要确保在服务器端代码处理输入数据之前删除任何不需要的字符,从而正确地清理输入数据。通常,用户通过 HTML 表单将他们的数据输入到 PHP Web 应用程序。如果表单数据包含任何不需要的字符,则可能会证明它是有害的,因此必须执行适当的清理操作。

在 PHP 中,可以借助以下一个或多个函数来完成输入清理。

htmlspecialchars() 函数

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


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

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

特殊字符的翻译方式如下所示 -

字符 替代为
& (& 符号) &
" (双引号) ",除非设置了 ENT_NOQUOTES
' (单引号) '(对于 ENT_HTML401) 或  '(对于 ENT_XML1、ENT_XHTML 或 ENT_HTML5),但前提是设置了 ENT_QUOTES
< (小于) &lt;
> (大于) &gt;

常量 flags

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

意义
ENT_COMPAT 将转换双引号,而不使用单引号。
ENT_QUOTES 将转换双引号和单引号。
ENT_NOQUOTES 将保持双引号和单引号未转换。
ENT_IGNORE 丢弃无效的代码单元序列,而不是返回空字符串。
ENT_SUBSTITUTE 将无效的代码单元序列替换为 Unicode 替换字符 U+FFFD (UTF-8) 或 &#xFFFD;
ENT_DISALLOWED 将给定文档类型的无效码位替换为 Unicode 替换字符 U+FFFD (UTF-8) 或 &#xFFFD;(否则)而不是保持原样。这可能很有用。
ENT_HTML401 以 HTML 4.01 格式处理代码。
ENT_XML1 将代码作为 XML 1 处理。
ENT_XHTML 将代码处理为 XHTML。
ENT_HTML5 以 HTML 5 格式处理代码。

例子

请看下面的例子 -


<?php
   $str = '欢迎浏览 "PHP 教程" ,来自 <b>qikepu</b>';
   echo htmlspecialchars($str);
?>

它将产生以下输出 -

欢迎浏览 "PHP 教程" ,来自 <b>qikepu</b>

strip_tags() 函数

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


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

当您希望确保用户输入不包含任何潜在的恶意标签时,此功能非常有用。

allowed_tags 参数是可选的第二个参数,用于指定不应剥离的标签。这些要么以字符串形式给出,要么以数组形式给出。

例子

请看下面的例子 -


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

   // 允许<p>和<a>
   echo strip_tags($text, '<p><a>');
?>

它将产生以下输出 -

Hello World 
      Click Here
Hello World

 
      Click Here

addslashes() 函数

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


 addslashes(string $string): string

该函数返回一个字符串,并在需要转义的字符之前添加了反斜杠。这些字符是 -

  • 单引号 (')
  • 双引号 (")
  • 反斜杠 (\)
  • NUL (NUL 字节)

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

例子

请看下面的例子 -


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

   // 打印转义的字符串
   echo($str);  
?>

它将产生以下输出 -

Newton\'s Laws

filter_var() 函数

借助特定的过滤器标志,您可以使用 filter_var() 函数来清理用户输入。


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

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

ID 描述
FILTER_SANITIZE_EMAIL 删除除字母、数字和 !#$%&'*+-=?^_'{|} 之外的所有字符~@.[].
FILTER_SANITIZE_ENCODED URL 编码字符串,可以选择去除或编码特殊字符。
FILTER_SANITIZE_ADD_SLASHES 应用 addslashes()。(从 PHP 7.3.0 开始可用)。
FILTER_SANITIZE_NUMBER_FLOAT 删除除数字、+- 和可选的 .,eE 之外的所有字符。
FILTER_SANITIZE_NUMBER_INT 删除除数字、加号和减号之外的所有字符。
FILTER_SANITIZE_SPECIAL_CHARS HTML编码'“<>和ASCII值小于32的字符,可以选择剥离或编码其他特殊字符。
FILTER_SANITIZE_FULL_SPECIAL_CHARS 等效于在设置了 ENT_QUOTES的情况下调用 htmlspecialchars()。可以通过设置 FILTER_FLAG_NO_ ENCODE_QUOTES 来禁用对引号进行编码。
FILTER_SANITIZE_URL 删除除字母、数字和 $-_.+!*'(),{}|\\^~[]'<>#%“;/?:@&=.
FILTER_UNSAFE_RAW 不执行任何操作,或者对指定的字符进行编码和剥离。

例子

以下代码显示了如何清理电子邮件数据 -


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

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

它将产生以下输出 -

abcdef@xyz.com

例子

以下代码显示了如何清理 URL -


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

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

它将产生以下输出 -

http://example.com