PHP 安全函数:strip_tags、filter_var、Md5 和 sha1

⚡ 智能摘要

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

  • 🛡️ 了解威胁: 主要风险包括 SQL 注入、跨站脚本攻击和代码注入,通常通过表单或其他方式传播。 URL 参数。
  • 🧹 标签条: strip_tags 函数会移除 HTML 标签。 Java从输入中提取脚本和 PHP 标签,降低存储跨站脚本攻击的风险。
  • 验证输入: filter_var 会验证和清理数据,确认值是预期类型后,代码才会信任它。
  • 🔒 逃脱或绑定: mysqli_real_escape_string 可以转义查询输入,但参数化预处理语句才是抵御 SQL 注入的更强有力的防御手段。
  • ???? 哈希密码(右): 永远不要使用 MD5 或 SHA1 存储密码;请使用 password_hash 和 password_verify,它们采用速度较慢的加盐 bcrypt 哈希算法。
  • ???? 纵深防御: 合并验证,escaping而不是依赖单一控制措施,而是采用 HTTPS 和最小权限数据库帐户。
  • 🤖 人工智能辅助: AI 工具可以审核 PHP 代码中的安全漏洞,并帮助安全地修复 SQL 注入或 XSS 漏洞。

PHP 安全性

潜在的安全威胁

基本上有两类人可以攻击你的系统:

  • 黑客——意图获取未经授权的数据或破坏应用程序
  • 用户——他们可能会无意中在表单中输入错误的参数,这可能会对网站或网络应用程序产生负面影响。

以下是我们需要警惕的攻击类型。

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

PHP strip_tags

假设您收到以下用户输入: 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

PHP strip_tags

现在让我们使用 strip_tags 函数来保护我们的应用程序免受此类攻击。

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

浏览到 URL http://localhost/phptuts/comments.php

PHP strip_tags

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.

PHP Md5 和 PHP sha1

重要提示: 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 中处理密码的正确且面向未来的方式。

常见问题

在 mysqli 或 PDO 中使用带绑定参数的预处理语句。它们将查询和数据分开发送,因此用户输入永远不会改变查询结构。这比手动执行预处理语句更安全。ping 输入。

`strip_tags` 会完全移除 HTML 和 PHP 标签,而 `htmlspecialchars` 会将它们转换为安全的实体,以便它们能以文本形式显示。输出格式为 esca。ping 对于 XSS 攻击,htmlspecialchars 通常是更安全的选择。

每个会话生成一个唯一的 CSRF 令牌,将其作为隐藏字段嵌入到每个表单中,并在提交时进行验证。拒绝任何令牌缺失或与存储值不匹配的请求。

是的。人工智能可以扫描 SQL 注入、XSS、不安全的密码哈希和不安全的文件处理等漏洞,然后解释每项风险并提供修复建议。请将其视为有用的初步检查,而不是安全审查的替代品。

是的。粘贴存在漏洞的代码,人工智能可以用预处理语句重写它,输出逃逸代码。ping以及输入验证。测试修正后的代码,并针对原始攻击输入确认修复效果。

总结一下这篇文章: