【发布时间】:2011-04-12 20:32:30
【问题描述】:
我通过查看网络上的各种文章和教程构建了简单的 PHP 应用程序。由于我现在将其提供给一些客户,因此我担心它的安全性。如何确保它不会被黑客入侵?
【问题讨论】:
-
stackoverflow.com/questions/72394/… 接受的答案包含大量信息。
标签: php security web-applications
我通过查看网络上的各种文章和教程构建了简单的 PHP 应用程序。由于我现在将其提供给一些客户,因此我担心它的安全性。如何确保它不会被黑客入侵?
【问题讨论】:
标签: php security web-applications
我选择的清理用户输入的函数是
$input = mysql_real_escape_string($input);<br>
$input = trim($input);<br>
$input = strip_tags($input);<br>
$input = htmlspecialchars($input);
然后如果我想禁止某些字符,那么我只需执行以下操作。
$nono = array("=", "{", "}", ";", "[", "]","$","&");<br>
$input = str_replace($nono, "", $input);
【讨论】:
对于 Web 应用程序的安全性,您真的不能错过 OWASP。它由一群专注于Web应用安全的安全专家组成,并定期更新相关资源。
最著名的是OWASP Top 10(2010 最新版本),它总结了 Web 应用程序经常遇到的 10 大安全风险。当人们试图在渗透测试或代码审查期间评估 Web 应用程序的安全级别时,这已成为事实上的参考。
对于开发人员,您还可以在他们的development guide 中增加,其中包含您编写代码时的一些注意事项。
此外,{ISC}^2 在这个主题中也有一些不错的reference。我会推荐一个关于如何将安全性集成到您的软件开发生命周期 (SDLC) 中的文章。您可能还想阅读 Web 应用程序安全 101 演示幻灯片。
【讨论】:
如果您只是从确保代码安全的角度来谈论,那么您应该注意一些事项(这是一个不完整的列表,但应该可以帮助您入门):
如果您的应用程序中有任何 SQL 查询并且其中任何一个使用来自用户的输入,则您可能容易受到 SQL 注入的攻击。这是当用户在表单字段的位置提交恶意内容时,当将其插入到您的查询中时,攻击者将能够访问您数据库的其他部分。
如何防止:您从用户那里获得的任何输入都需要在您在查询中使用之前过滤。为此,您可以使用prepared(或parameterized)语句(即mysqli::prepare 或PDO)或使用正确转义输入值的函数在查询中使用它们之前(即mysql_real_escape_string)
如果您从用户那里获取任何输入并将其输出到另一个页面(例如,您可能会收集用户数据,然后输出用户列表),您可能容易受到 XSS 攻击。这些工作的方式是将代码(通常是<script>标签)添加到表单字段中,如果在输出之前没有对它们进行清理,攻击者会将他们自己的Javascript添加到您的页面中,这将在您的页面上下文中运行(因此,可以访问您的 cookie 等内容)。
如何预防:除非有充分的理由让您的用户输出 HTML,否则每次输出来自用户的内容时,都应使用htmlspecialchars 对其进行清理,这将将具有潜在危险的字符(例如< 和>)转换为 HTML 实体。如果你必须让你的用户输出 HTML,你应该有一组特定的允许标签,并确保只允许这些标签通过(例如使用 DOM 解析器或strip_tags)。
另请参阅: The Cross-Site Scripting (XSS) FAQ
这是一种攻击,其中攻击者利用存储在用户的浏览器。例如,假设您创建了一个银行应用程序,攻击者可能会导致仍然拥有您网站的有效身份验证 cookie 的合法用户在不知情的情况下请求 http://yourapp.com/transfer_funds.php?to=attacker。
如何防止: GET 请求应该是 idempotent(也就是说,应该始终具有相同的效果,或者不应导致您的应用程序状态更改)。这意味着用户可以进行的任何操作(例如,CRUD 操作)都应该通过POST 进行,而不是GET。同样,对于这些操作,您应该检查 $_POST,而不是 $_REQUEST,因为 $_REQUEST 将包含来自 $_POST 和 $_GET 的值。
但是,即使您正在使用 POST。为了更好地保护,许多人使用挑战令牌系统,其中应用程序生成与用户会话相关的随机字符串。此质询令牌与应用程序本身发出的任何相关请求(通过将其包含在表单中)一起传递,然后在允许进行任何操作之前进行验证。请注意,如果您的应用程序存在 XSS 漏洞,您的质询令牌可能会被泄露。
另请参阅: The Cross-Site Request Forgery (CSRF/XSRF) FAQ
eval或系统命令如果您将eval 与用户输入一起使用,您将打开您的整个应用程序环境(以及除此之外,您的服务器环境)以受到潜在的攻击,因为如果您不是非常小心(即使您是),您让用户能够运行他们想要的任何任意代码。这可能导致修改数据库、更改服务器环境、在服务器上安装和运行脚本或二进制文件、删除 PHP 文件……(这种攻击适用于任何进行系统调用的 PHP 函数,包括system、fopen、任何访问文件系统的函数……所以在使用用户输入时要非常小心!)
如何预防:不要在用户输入时使用eval。如果您认为需要在用户输入中使用eval,则可能有更好(更安全)的方法来解决问题。
【讨论】:
在开发 Web 应用程序时,最重要的事情是将用户输入视为瘟疫。这是邪恶的,不可信任!
任何时候您使用客户端/用户可能修改的变量(例如 POST、GET 或其他变量)时,都需要对其进行清理。删除任何不属于您期望的输入的多余内容。
例如,如果您有以下代码:
$var = $_POST['myNumber'];
echo 'You entered the number ' . $var . '!';
此代码容易受到攻击 - 您需要在此处清理 POST 变量:
$cleanVar = sanitize($_POST['myNumber']);
echo 'You entered the number ' . $cleanVar. '!';
sanitize(string) 是一个删除多余引号之类的函数。您可以想象传入第二个参数,以正确过滤您期望的内容类型。例如,告诉您的 sanitize 函数以某种方式去除数字的废话,并以另一种方式去除字符串。
【讨论】: