PHP 安全问题入门:10 个常见安全问题 + 实例讲解( 四 )


<?php$targetIp = $_GET['ip'];$output = shell_exec("ping -c 5 $targetIp");输出将包括对目标主机 Ping 5次 。除非采用 sh 命令执行 Shell 脚本,否则攻击者可以执行想要的任何操作 。
ping.php?ip=8.8.8.8;ls -l /etcShell 将执行 Ping 和由攻击者拼接的第二个命令,这显然是非常危险的 。
感谢 PHP 提供了一个函数来转义 Shell 参数 。
escapeshellarg 转义用户的输入并将其封装成单引号 。
<?php$targetIp = escapeshellarg($_GET['ip']);$output = shell_exec("ping -c 5 $targetIp");现在你的命令应该是相当安全的,就个人而言,我仍然避免使用 PHP 调用外部命令,但这完全取决于你自己的喜好 。
另外,我建议进一步验证用户输入是否符合你期望的形式 。
8. XXEXXE (XML 外部实体) 是一种应用程序使用配置不正确的 XML 解析器解析外部 XML 时,导致的本地文件包含攻击,甚至可以远程代码执行 。
XML 有一个鲜为人知的特性,它允许文档作者将远程和本地文件作为实体包含在其 XML 文件中 。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY passwd SYSTEM "file:///etc/passwd" >]><foo>&passwd;</foo>就像这样,/etc/passwd 文件内容被转储到 XML 文件中 。
如果你使用 libxml 可以调用 libxml_disable_entity_loader 来保护自己免受此类攻击 。使用前请仔细检查 XML 库的默认配置,以确保配置成功 。
9. 在生产环境中不正确的错误报告暴露敏感数据[](https://secure.php.net/manual...,可能会在生产环境中因为不正确的错误报告泄露了敏感信息,例如:文件夹结构、数据库结构、连接信息与用户信息 。

PHP 安全问题入门:10 个常见安全问题 + 实例讲解

文章插图
 
你是不希望用户看到这个的吧?
一般根据你使用的框架或者 CMS,配置方法会有不同的变化 。通常框架具有允许你将站点更改为某种生产环境的设置 。这样会将所有用户可见的错误消息重定向到日志文件中,并向用户显示非描述性的 500 错误,同时允许你根据错误代码检查 。
但是你应该根据你的 PHP 环境设置: error_reporting 与 display_errors.
10. 登录限制像登录这样的敏感表单应该有一个严格的速率限制,以防止暴力攻击 。保存每个用户在过去几分钟内失败的登录尝试次数,如果该速率超过你定义的阈值,则拒绝进一步登录尝试,直到冷却期结束 。还可通过电子邮件通知用户登录失败,以便他们知道自己的账户被成为目标 。

【PHP 安全问题入门:10 个常见安全问题 + 实例讲解】


推荐阅读