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

潜在的安全威胁

基本上,有两类人可能会攻击您的系统

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

以下是我们应该警惕的攻击类型。

SQL 注入 – 此类攻击会将有害代码追加到 SQL 语句中。

这是通过用户输入表单或使用变量的 URL 来完成的。

追加的代码会注释掉 SQL 语句 WHERE 子句中的条件。追加的代码还可以:

  • 插入一个始终为真的条件
  • 从表中删除数据
  • 更新表中的数据
  • 此类攻击通常用于未经授权访问应用程序。

跨站脚本 – 此类攻击会插入通常是 JavaScript 的有害代码。这是通过用户输入表单(如联系我们和评论表单)完成的。这样做的目的是:

  • 检索敏感信息,如 cookie 数据
  • 将用户重定向到其他 URL。
  • 其他威胁可能包括 – PHP 代码注入、Shell 注入、邮件注入、脚本源代码泄露等。

PHP 应用程序安全最佳实践

现在让我们看看我们在开发应用程序时必须考虑的一些 PHP 安全最佳实践。

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 https:///phptuts/comments.php

PHP strip_tags

假设您收到用户输入如下:<script>alert(‘Your site sucks!’);</script>

<?php

$user_input = "<script>alert('Your site sucks!');</script>";

echo "<h4>My Commenting System</h4>";

echo $user_input;

?>

浏览到 URL https:///phptuts/comments.php

PHP strip_tags

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

<?php

$user_input = "<script>alert('Your site sucks!');</script>";

echo strip_tags($user_input);

?>

浏览到 URL https:///phptuts/comments.php

PHP strip_tags

PHP filter_var 函数

filter_var 函数用于验证和清理数据。

验证检查数据是否是正确的类型。对字符串进行数字验证检查会返回 false。

清理是从字符串中删除非法字符。

请查看此链接以获取完整参考 filter_var

该代码用于评论系统。

它使用 filter_var 函数和 FILTER_SANITIZE_STRIPPED 常量来去除标签。

<?php

$user_input = "<script>alert('Your site sucks!');</script>";

echo filter_var($user_input, FILTER_SANITIZE_STRIPPED);

?>

输出

alert('Your site sucks!');

mysqli_real_escape_string 函数 此函数用于保护应用程序免受 SQL 注入。

假设我们有以下 SQL 语句来验证用户 ID 和密码。

<?php
SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass';
?>

恶意用户可以在用户 ID 文本框中输入以下代码。‘ OR 1 = 1 — 并在密码文本框中输入 1234。让我们编写认证模块。

<?php

$uid = "' OR 1 = 1 -- ";

$pwd = "1234";

$sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';";

echo $sql;

?>

最终结果将是

SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';

此处,

  • “SELECT * FROM users WHERE user_id = ”” 测试空用户 ID
  • “’ OR 1 = 1 “ 是一个始终为真的条件
  • “–” 注释掉测试密码的部分。

上述查询将返回所有用户。现在让我们使用 mysqli_real_escape_string 函数来保护我们的登录模块。

<?php

$uid = mysqli_real_escape_string("' OR 1 = 1 -- ");

$pwd = mysqli_real_escape_string("1234");

$sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';";

echo $sql;

?>

上面的代码将输出

SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';

请注意第二个单引号已被转义,它将被视为用户 ID 的一部分,并且密码不会被注释掉。

PHP Md5 和 PHP sha1

Md5 是 Message Digest 5 的缩写,sha1 是 Secure Hash Algorithm 1 的缩写。

它们都用于加密字符串。

一旦字符串被加密,解密它就会很麻烦。

Md5 和 sha1 在将密码存储在数据库中时非常有用。

下面的代码显示了 md5 和 sha1 的实现

<?php
echo "MD5 Hash: " . md5("password");
echo "SHA1 Hash: " . sha1("password");
?>

假设您已将 hashes.php 文件保存在 phptuts 文件夹中,请浏览到 URL

PHP Md5 and PHP sha1

从上面的哈希值可以看出,如果攻击者获得了对您数据库的访问权限,他们仍然不知道如何登录的密码。

摘要

  • 安全性是指为保护应用程序免受意外和恶意攻击而采取的措施。
  • strip_tags 函数用于从输入数据中删除 等标记
  • filter_var 函数用于验证和清理 PHP 输入数据
  • mysqli_real_escape_string 用于清理 SQL 语句。它会从语句中删除恶意字符
  • MD5 和 SHA1 都用于加密密码。