在 PHP 中清理输入

Shraddha Paghdar 2023年1月30日
PHP
  1. 在 PHP 中使用 htmlentities() 处理 HTML 输入
  2. 在 PHP 中使用 filter_var() 处理 HTML 输入
  3. PHP 中的 SQL 查询清理
在 PHP 中清理输入

用户数据需要存储在数据库中,但是在存储到数据库之前,我们需要确保不传递格式错误的数据;否则,它会搞砸数据库。这将保护数据的完整性。用户经常在清理和验证之间混淆。它们之间的唯一区别是验证确保数据的格式是否正确,而稍后确保数据中不存在非法字符。在今天的帖子中,我们将学习如何在将 PHP 中的输入数据传递到数据库(RDBMS/NoSQL)之前对其进行清理。

需要清理的最常见的输入是 HTML、通过 SQL 查询的输入和用户配置文件信息。

在 PHP 中使用 htmlentities() 处理 HTML 输入

它是 PHP 提供的内置函数,可将所有字符转换为 HTML 实体。你也可以使用 htmlspecialchars(),这两个函数的唯一区别是 htmlspecialchars() 将特殊字符转换为 HTML 实体,而 htmlentities() 转换所有字符。

PHP 中 htmlentities() 的语法

htmlentities(string $string, $flags, $characterSet, boolean $doubleEncode);

参数

  • $string:它是一个强制性参数,它接受应该进行转换的输入数据。
  • $flags:这是一个可选参数,指定如何处理无效编码、引号和使用的文档类型。一些标志是 ENT_COMPATENT_IGNOREENT_HTML5ENT_NOQUOTES 等。
  • $characterSet:这是一个可选参数,用于指定要使用的字符集。一些字符集是 UTF-8ISO-8859-1 等。
  • doubleEncode:这是一个可选参数,用于指定是否对现有的 HTML 实体进行编码。默认值为 true,它将转换所有内容。

返回值

上述函数的输出包含一个转换后的字符串。如果字符串参数包含无效编码,它将返回一个空字符串,除非任何标志设置为 ENT_IGNOREENT_SUBSTITUTE

示例代码:

<?php
    $str = '<a href="https://www.google.com">Go to google.com</a>';
    echo htmlentities($str);
?>

输出:

&lt;a href=&quot;https://www.google.com&quot;&gt;Go to google.com&lt;/a&gt;

在 PHP 中使用 filter_var() 处理 HTML 输入

它是 PHP 提供的内置函数,其中对输入数据执行验证和清理。

PHP 中 filter_var() 的语法

filter_var($inputValue, $filterType);

参数

  • $inputValue:这是一个强制参数,它获取将应用过滤器检查的输入数据。
  • $filterType:这是一个强制参数,它指定对输入数据执行什么过滤器检查。支持的值是:
    • FILTER_VALIDATE_INT:输入数据是否为有效整数。
    • FILTER_SANITIZE_STRING:输入数据是否为有效字符串,并从输入字符串中删除所有 HTML 标签。
    • FILTER_VALIDATE_IP:输入数据是否是有效的 IP 地址。
    • FILTER_SANITIZE_EMAIL:输入数据是否是有效的电子邮件地址。Filter var 会先去除非法字符,然后再进行验证。

返回值

如果成功通过,则返回过滤后的值。

示例代码:

<?php
    $inputString = "<p>Hello World! Welcome to PHP tutorial</p>";
    $newstr = filter_var($inputString, FILTER_SANITIZE_STRING);
    echo $newstr. "\n";
?>

输出:

Hello World! Welcome to PHP tutorial

PHP 中的 SQL 查询清理

为防止 SQL 注入,开发人员应始终使用 PDO/MySQLi。PDO 是一个数据库抽象层。PDO 清理外部数据并将其安全地嵌入到 SQL 查询中并避免此类问题。在将数据发送到 DB 之前,使用 filter_var() 处理数据。

示例代码:

<?php
    $servername = "hostname";
    $username = "username";
    $password = "password";
    $dbname = "databaseName";
    $lastname = "doe";

    $connection = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $statement = $connection->prepare("SELECT id, email, firstname, lastname FROM Users WHERE lastname=:lastname");
    $statement->execute(['lastname' => $lastname]);

    $resultOuput = $statement->setFetchMode(PDO::FETCH_ASSOC);
?>
Shraddha Paghdar avatar Shraddha Paghdar avatar

Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.

LinkedIn