我通过查看Web上的各种文章和教程构建了简单的PHP应用程序.由于我现在给几个客户,我担心它的安全性.我如何确保它不被黑客入侵?
如果你只是从保证代码安全的角度谈论,你应该注意一些事情(这是一个不完整的列表,但应该让你开始):
如果您的应用程序中有任何SQL查询,并且其中任何一个使用来自用户的输入,那么您可能容易受到SQL注入攻击.这是当用户在表单字段的位置提交恶意内容时,在插入查询时,会使攻击者能够访问数据库的其他部分.
如何防止:在查询中使用之前,您从用户获得的任何输入都需要进行清理.为此,您可以使用预准备(或参数化)语句(即.mysqli::prepare
或PDO)或使用在您的查询中使用它们之前正确转义输入值的函数(即.mysql_real_escape_string
)
如果您从用户那里获取任何输入并将其输出到另一个页面(例如,您可能会收集用户数据然后输出用户列表),则您可能容易受到XSS攻击.这些工作的方式是将代码(通常是标签)添加到表单字段中,如果在输出之前它们没有被清理,攻击者就会在页面中添加自己的Javascript,这将在页面的上下文中运行(因此,可以访问像你的cookie一样的东西.
如何预防:除非有充分的理由让您的用户输出HTML,每一个你,来自于用户输出的东西,应该用消毒的时间用htmlspecialchars,它会变成潜在的危险字符(<
和>
例如)为HTML实体.如果必须让用户输出HTML,则应该有一组特定的标记,并确保只允许那些标记(strip_tags
例如使用DOM解析器).
另请参阅: 跨站点脚本(XSS)常见问题解答
这是一种攻击,攻击者欺骗用户的浏览器自己发出请求(例如,通过向您的站点注入代码,尽管攻击实际上可以来自任何地方),利用存储在用户浏览器中的身份验证cookie.例如,假设您创建了一个银行应用程序,攻击者可能会导致仍然拥有您网站的活动身份验证Cookie的合法用户在http://yourapp.com/transfer_funds.php?to=attacker
不知情的情况下进行请求.
如何防止: GET
请求应该是幂等的(也就是说,应该始终具有相同的效果,或者不应该导致应用程序状态发生变化).这意味着用户可以执行的任何操作(例如,CRUD操作)都应该通过POST
,而不是GET
.同样,您应该检查$_POST
,而不是检查$_REQUEST
这些操作,因为$_REQUEST
它将包含来自$_POST
和的值$_GET
.
但是,即使您使用POST,您的应用程序仍然可能容易受到CSRF的攻击.为了更好地保护,许多人使用挑战令牌系统,其中应用程序生成与用户会话相关的随机字符串.此挑战令牌与应用程序本身所做的任何相关请求一起传递(通过将其包含在表单中),然后在允许任何操作发生之前进行验证.请注意,如果您的应用程序存在XSS漏洞,则您的质询令牌可能会受到威胁.
另请参见: 跨站请求伪造(CSRF/XSRF)常见问题解答
eval
或系统命令如果您eval
与用户输入一起使用,您将打开整个应用程序环境(除此之外,您的服务器环境)以进行潜在的攻击,因为如果您不是非常小心(即使您是),您也在为用户提供服务能够运行他们想要的任意代码.这可能导致修改数据库,更改服务器环境,在服务器上安装和运行脚本或二进制文件,删除PHP文件......(同样的攻击适用于任何进行系统调用的PHP函数,包括system
,, fopen
访问文件系统的任何函数......所以在使用用户输入时要非常小心!)
如何防范:不要eval
与用户输入一起使用.如果您认为需要使用eval
用户输入,则可能有更好(更安全)的方法来解决问题.