PHP 安全函数:strip_tags、filter_var、Md5 和 sha1
⚡ 智能摘要
PHP 安全通过验证、清理和安全存储数据来保护 Web 应用程序免受攻击者和粗心输入的侵害。本演练将介绍主要威胁,然后演示 strip_tags、filter_var 和 esca 等函数。ping并使用 password_hash 进行现代密码哈希处理,以防御 XSS、SQL 注入和凭据被盗。

潜在的安全威胁
基本上有两类人可以攻击你的系统:
- 黑客——意图获取未经授权的数据或破坏应用程序
- 用户——他们可能会无意中在表单中输入错误的参数,这可能会对网站或网络应用程序产生负面影响。
以下是我们需要警惕的攻击类型。
SQL注入 这种类型的攻击会将有害代码附加到目标位置。 SQL 声明。
这是通过用户输入表单或 URL使用变量的。
附加代码会注释掉 SQL 语句 WHERE 子句中的条件。附加代码还可以:
- 插入一个始终为真的条件
- 从表中删除数据
- 更新表中的数据
此类攻击通常用于获取对应用程序的未经授权的访问。
跨站脚本(XSS) 这种类型的攻击通常会插入有害代码。 Java脚本。这是通过用户输入表单(例如联系我们表单和评论表单)完成的。这样做的目的是:
- 检索敏感信息,例如 cookie 数据
- 将用户重定向到其他页面 URL.
其他威胁可能包括 PHP 代码注入、shell 注入、电子邮件注入和脚本源代码泄露。
PHP 应用程序安全最佳实践
现在让我们来看看开发过程中必须考虑的一些 PHP 安全最佳实践。ping 我们的应用程序。
PHP strip_tags
strip_tags 函数会移除 HTML 标签。 JavaScript或者从字符串中提取 PHP 标签。
当我们需要保护应用程序免受跨站脚本攻击等攻击时,此功能非常有用。
让我们考虑一个接受用户评论的应用程序。
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
假设您已将 comments.php 文件保存在 phptuts 文件夹中,请浏览至该文件夹。 URL http://localhost/phptuts/comments.php
假设您收到以下用户输入: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
浏览到 URL http://localhost/phptuts/comments.php
现在让我们使用 strip_tags 函数来保护我们的应用程序免受此类攻击。
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
浏览到 URL http://localhost/phptuts/comments.php
PHP filter_var 函数
filter_var 函数用于验证和清理数据。
验证检查数据是否属于正确类型。对字符串进行数字验证检查会返回错误结果。
清理是指从 绳子.
请点击此链接查看完整参考资料: 过滤器变量
以下代码用于评论系统。它使用 filter_var 函数和 FILTER_SANITIZE_STRIPPED 常量来去除标签。
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
输出:
alert('Your site sucks!');
注意: 从 PHP 8.1 开始,FILTER_SANITIZE_STRIPPED(FILTER_SANITIZE_STRING 的别名)已被弃用。对于新代码,请使用 strip_tags() 或为了安全显示,请使用 htmlspecialchars()。
PHP mysqli_real_escape_string
mysqli_real_escape_string 函数用于帮助保护应用程序免受 SQL 注入攻击。
假设我们有以下 SQL 语句用于验证用户 ID 和密码。
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
恶意用户可以进入 ' 或 1 = 1 — 在用户ID文本框中输入1234,在密码文本框中输入1234。接下来我们编写身份验证模块。
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
最终结果将是:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
这里,
- “WHERE uid = ”” 测试用户 ID 是否为空
- “' OR 1 = 1”是一个始终成立的条件。
- “–” 注释掉了测试密码的部分。
上述查询将返回所有用户。现在,我们使用 `mysqli_real_escape_string` 函数来保护我们的登录模块。请注意,在实际代码中,此函数将数据库连接作为其第一个参数。
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
上述代码将输出:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
注意:第二个单引号已被转义,因此它将被视为用户 ID 的一部分,密码不会被注释掉。
最佳实践: 饵ping 虽然有所帮助,但使用 mysqli 或 PDO 中的参数化预处理语句是防止 SQL 注入的推荐防御措施,因为数据永远不会混入查询文本中。
PHP Md5 和 PHP sha1
MD5 是 Message Digest 5 的缩写,SHA1 是 Secure Hash Algorithm 1 的缩写。它们都是单向哈希函数。
下面的代码展示了 md5 和 sha1 的实现。
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
假设您已将 hashes.php 文件保存在 phptuts 文件夹中,请浏览到该文件夹。 URL.
重要提示: MD5 和 SHA1 是速度快、无盐哈希算法,而且 不再被认为适合存储密码因为现代硬件和彩虹表可以快速破解它们。请仅将它们用于非安全校验和,密码请使用以下方法。
如何在 PHP 中安全地哈希密码
PHP 提供了 password_hash 和 password_verify 函数来存储密码。它们采用速度较慢的加盐算法(默认使用 bcrypt),因此即使数据库被盗,每个哈希值也都是唯一的,破解成本很高。
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- 密码哈希() 生成一个加盐哈希值并存储在数据库中;PASSWORD_DEFAULT 会使您继续使用当前推荐的算法。
- 密码验证() 在不解密的情况下,将登录尝试与存储的哈希值进行比较。
因为盐值和算法存储在哈希值中,所以您永远不需要自己管理它们,这使得它成为在 PHP 中处理密码的正确且面向未来的方式。




