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
假设您收到用户输入如下:<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
现在让我们使用 strip_tags 函数来保护我们的应用程序免受此类攻击。
<?php $user_input = "<script>alert('Your site sucks!');</script>"; echo strip_tags($user_input); ?>
浏览到 URL https:///phptuts/comments.php
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
从上面的哈希值可以看出,如果攻击者获得了对您数据库的访问权限,他们仍然不知道如何登录的密码。
摘要
- 安全性是指为保护应用程序免受意外和恶意攻击而采取的措施。
- strip_tags 函数用于从输入数据中删除 等标记
- filter_var 函数用于验证和清理 PHP 输入数据
- mysqli_real_escape_string 用于清理 SQL 语句。它会从语句中删除恶意字符
- MD5 和 SHA1 都用于加密密码。