一、概述PHP的安全问题主要集中在用户提交的变量上,因为PHP这种语言为了和用户交互,必然要用户输入数据,并且把数据存为变量,然后程序在处理这些用户提交的信息,并且返回处理后的信息给用户,结果导致攻击者提交特殊的数据给程序,使程序错误运行,从而达到攻击者想达到的目的。
二、错误例子分析
1.一般回显变量的问题
例子:
我最早些的guestbook就有这种问题,由于没有检查用户输入的数据,导致在显示这些数据的时候出现问题,由于编程者一般都检查用户直接输入的变量,而忽略对下拉框的可选择的数据输入的检查,还记得原来那个IB5K的跨站脚
本攻击漏洞吗?就是由于用户学历的输入用的是这种方式,而编写者又忽略了检查该变量,导致了跨站脚本攻击漏洞的出现,下面我就说说比较容易被忽视检查的变量。
程序中有这么一段:
提交后会出现$sex这个变量,这个变量虽然是用户选择的信息,但是用户可以通过URL直接提交$sex这个变量来骗过程序,比如我通过URL提交:
程序得到提交后,不经过任何检查,酒吧我提交的信息显示出来:
结果,用户浏览的时候就会出现弹出窗口,显示用户的COOKIE,达到跨站脚本攻击的目的,作用为PHP程序的编写者,正则表达式你应该会吧?
通过同正则表达式过滤用户提交$SEX变量,可以很好的避免这种错误,如eregi({<>(),#|;+-%$\/}.$sex)如果该表达式成立,则终止程序的运行或者给出提示信息都是很好的办法,你可以在编程中多考虑一下,也可以根据自己的需要过滤更多的字符。
2.函数中包含变量的问题
对file()readfile()fopen()systen()exec()eval()passthru()pxper()require()inducle()等等函数中如果包含有用户输入的变量,入,我编写过的一个文章管理程序中显示文章部分有如下代码:
当时我想,date文件夹都指定了,还能有什么问题?其实不然,如果用户输入$file=../../../../../../../../ect/pesswd呢?通过几次尝试后就可以看到passwd文件,里面是所有用户名,当然通过这种方式,所有的文件都可以浏览,感觉
到危险了吗?所以还是用正则表达式过滤比较好,而对于system()exec()这类函数更应该注意,因为他们是可以执行命令的
3.环境变量的问题
环境变量比较多,现结合我程序中的一个例子说一下$PHP_SELF这个变量引起的问题,我编的目录遍历程序中刚开始有这么一段:
看到了吗?弹出了窗口显示ABC,说明能进行跨站脚本攻击了,这是由于$PHP|_SELF变量被伪造的结果。本来$PHP_SELF变量应该收dir.php可当用户提交上述连接后$PHP_SELF变量就不是这个了,而是包括了/.../<script>alert
(abc)</script>这些东东,结果显示出来就可想而知了。
以前一直看到文章说某某程序由于包含了不安全的$PHP_SELF变量从而可以被攻击者绕过,初学者肯定也不太清楚为什么,通过上面的实际例子我想你应该明白了许多吧!
真正做到编写的程序相当安全还是很不容易的,要经历一段时间的学习和实践,相信大家经过实践都可以提高自己的PHP程序的安全性