我通过查看网络上的各种文章和教程构建了简单的PHP应用程序。由于我现在给几个客户,我担心它的安全性。我如何确保它不被黑客攻击?
答案 0 :(得分:6)
如果你只是从保证代码安全的角度谈论,你应该注意一些事情(这是一个不完整的列表,但应该让你开始):
如果您的应用程序中有任何SQL查询,并且其中任何一个使用来自用户的输入,您可能容易受到SQL注入攻击。这是用户在表单字段的位置提交恶意内容时,在插入查询时,会使攻击者能够访问数据库的其他部分。
如何防止:在您在查询中使用之前,您从用户那里获得的任何输入都需要进行清理。为此,您可以使用准备好的(或参数化)语句(即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,您的应用程序仍然可能容易受到CSRF的攻击。为了更好地保护,许多人使用挑战令牌系统,其中应用程序生成与用户会话相关的随机字符串。此挑战令牌与应用程序本身所做的任何相关请求一起传递(通过将其包含在表单中),然后在允许任何操作发生之前进行验证。请注意,如果您的应用程序存在XSS漏洞,则您的质询令牌可能会受到损害。
另请参阅: The Cross-Site Request Forgery (CSRF/XSRF) FAQ
eval
或系统命令如果您使用eval
以及用户输入,您将打开整个应用程序环境(除此之外,您的服务器环境)以进行潜在攻击,因为如果您不是非常小心(即使你是),你让用户能够运行他们想要的任意代码。这可能导致修改数据库,更改服务器环境,在服务器上安装和运行脚本或二进制文件,删除PHP文件......(同样的攻击适用于任何进行系统调用的PHP函数,包括system
,fopen
,访问文件系统的任何函数......所以在使用用户输入时要非常小心!)
如何预防:请勿在用户输入中使用eval
。如果您认为需要在用户输入中使用eval
,则可能有更好(更安全)的方法来解决问题。
答案 1 :(得分:2)
开发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)
是删除多余引号的函数,以及类似的东西。您可以想象传递第二个参数,以正确过滤您期望的内容类型。例如,告诉你的清理函数以某种方式为数字去除废话,而以另一种方式为字符串去除废话。
答案 2 :(得分:2)
对于Web应用程序安全性,您真的不能错过OWASP。它由一群专注于Web应用程序安全性的安全专家组成,并定期更新相关资源。
最着名的是OWASP Top 10(最新版本2010),它总结了Web应用程序通常遇到的十大安全风险。当人们试图在渗透测试或代码审查期间评估Web应用程序的安全级别时,这已成为事实上的参考。
对于开发人员来说,你可能会增加他们的development guide,其中包含一些DO和DON'Ts,当你为你编写代码时。
此外,{ISC} ^ 2在本主题中也有一些好reference。我建议如何将安全性集成到您的软件开发生命周期(SDLC)中。您可能还想阅读Web应用程序安全性101演示幻灯片。
答案 3 :(得分:0)
我清理用户输入的选择函数是
$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);