在 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_COMPAT
、ENT_IGNORE
、ENT_HTML5
、ENT_NOQUOTES
等。$characterSet
:这是一个可选参数,用于指定要使用的字符集。一些字符集是UTF-8
、ISO-8859-1
等。doubleEncode
:这是一个可选参数,用于指定是否对现有的 HTML 实体进行编码。默认值为true
,它将转换所有内容。
返回值
上述函数的输出包含一个转换后的字符串。如果字符串参数包含无效编码,它将返回一个空字符串,除非任何标志设置为 ENT_IGNORE
或 ENT_SUBSTITUTE
。
示例代码:
<?php
$str = '<a href="https://www.google.com">Go to google.com</a>';
echo htmlentities($str);
?>
输出:
<a href="https://www.google.com">Go to google.com</a>
在 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 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