目前PHP因其功能强大、入门简单、代码执行效率高等优点,成为了Web应用开发的流行语言。由于使用广泛,所以利用PHP安全漏洞对Web网站进行的攻击也越来越多,这给Web应用的安全带来了严重威胁。对网站的安全负有直接责任的主要有两类人员:一类是网站开发人员;一类是网站管理人员。本文笔者就从网站开发的角度,对PHP安全漏洞的防范进行了较为全面的总结、研究。
对以往大量攻击案例的研究表明,PHP安全漏洞的产生原因主要是没有对用户的输人进行严格的验证和对系统的输出没有进行适当的转义。用户的输入永远是不可以盲目相信的,在没有进行验证前,都可以认为是被污染数据。系统的愉出在没有适当转义前,也有可能带来较大的安全风险。
1、未对用户输入进行严格验证产生安全漏洞及其防范
考虑一个系统的登录验证,此系统要求用注册时所填的邮箱和密码登录。一般情况下,只要输入正确即可登录,如果输人错误则不允许登录,这是通常的处理流程。其程序实现一般是,通过一个登录表单获取用户输入的邮箱和密码,然后传递给程序以构造一个SQL查询语句,例如:select count(*)from users where email='myemail@163.com'and password='mypass',再将此SQL语句提交给后台数据库执行,若返回的记录数为0,则说明输人的邮箱信息或密码有误或用户根本没有注册,系统拒绝其登录,反之则为合法用户,允许其登录。这套验证流程对于一般的客户是十分奏效的,其若没有注册亦或没有袖人正确的邮箱和密码都是不能登录系统的。但对于黑客来说,情况就不一样了。其完全可以精心设计一个字符串来代替合法邮箱地址从而绕过系统的验证,例如:若黑客输人的邮箱地址是“myemail"orI=I--"、密码是"myppass",此时SQL语句变为select count(*)from users wherer email='myemail' or I=I--" and password='mypass' ,此语句执行后所返回的记录数是users表的所有记录总数,并不为0,所以通过了系统的登录验证,系统允许其登录。这就是著名的SQL注入攻击。导致这个后果的原因是黑客精心构造了一个字符串用于代替合法邮箱地址且系统并未对用户输入的数据本身进行合法性检查。
为了对上述PHP安全漏洞进行防范,我们可以对用户的输人进行合法性验证。此处要求入的是邮箱地址,为了对用户输入的数据本身进行合法性检查,我们可以用正则表达式对用户输人的邮箱地址进行验证,看是否符合正确的邮箱格式,这样就可以大大增加黑客设计特殊字符串的难度,在一定程度上防止SQL注人漏洞的产生。
在任何悄况下,如果对用户的输人均进行严格的验证,当然,验证方法根据不同情况而有所不同,并不局限于正则表达式,这就可以在很大程度上对PHP安全漏洞进行防范。
2、未对系统的输出进行适当转义产生安全漏洞及其防范
未对系统的输出进行适当转义也会产生安全漏洞,跨站脚本漏洞就是一个很著名的例子。假设有一个可以发表评论的系统,其采用表单的形式进行数据提交。对于一般用户,这不会有什么太大间题,但是对于黑客,问题就来了。因为黑客并不是真的想发表什么评论,其有可能是想盗取其他登录用户的cookies。为了盗取其他录用户的cookies, 黑可以将javascript代码作为评论内容进行提交。
如果在输出前对黑客所提交的内容不做任何转义的话,那么lavascript代码将被其他用户的浏览器所执行,从而将浏览评论的其他登录用户的cookies信息发送到黑客手上。为了防范上述跨站脚本漏洞攻击,我们所要采取的措施很简单:在将评论内容输出到客户端浏览器之前,利用htmlentities()函数对输出内容进行转义。此函数可以将输出内容当中可能包含的html标签转换成html实体,从而使得黑客输入的Javascript代码不被执行。
任何情况下,对于系统的输出都应该进行适当的转义(转义方法根据不同情况而有所不同,并不局限于htmlentities()函数),这样才不会让黑客有机可乘。
声明:本文由郑州批发市场:http://www.shun-e.com/market/ 原创投稿,尊重他人成果,转载请注明出处!