很多朋友都在使用PHP开发Web应用程序,程序虽然写了很多,但是安全问题却考虑得非常少,这可不是好现象。下面我们就一起来讨论PHP的安全问题,希望大家都能写出安全性很高的程序!
页面变量
如果只用几个页面来做一个站点的话,大家都希望用相同的页眉和页脚,而程序员常常是用一个索引来做输出页眉,再用同样的方法输出页脚。
有的站点为了选择页面的内容,用定义在URL中的页面变量。如下:
这是个普通的错误:当PHP包括一个页面时,它不能考虑这个页面是本地的还是远程服务器上的。攻击者可以容易地变URL为:
这样将促使PHP从远程服务器上下载crack.php,并在本地服务器上执行!简单来说,就会将/etc/passwd文件暴露给攻击者。
SQL&URL安全
SQL注入是现在非常时髦的攻击方法了,我们来看看这样的攻击方法是怎么造成的:假如有个URL是"http://www.unsecuresite.com/index.php?id=3",我们假设ID变量被用在SQL中,当出现错误时,有些开发者喜欢输出SQL命令。如果要把'加入到URL中就可能出现错误。如下:
"Error:SELECT*FROM Mytable WHERE ID='3'"
在这里面我们看到被指定在URL中ID变量直接用在了SQL命令中,如果我们把URL.变成http://www.unsecuresite.corn/index,php?id=3'%20OR%20id='0(%20是一个空格),应用程序将运行SQL命令:
"SELECT*FROM Mytable WHERE ID='3' OR ID='0'"
一个初步的注人就形成了!
为了避免这些,必须常常检查用在URL中的变量。例如,可以这样:
SQL注册页面问题
在站点上用用户登录,必须注意我们的SQL。假设有一个注册页面如下:
我们假定$Username和$Password被用在一个SQL命令中。如下:
应用程序将检查SQL命令是否返回记录并记录它。
很多站点有成千上万的用户。假如我们在用户名一栏里写'admin';--",在密码那一栏里写一些无用的东西,SQL命令将执行如下:
在这个例子中,数据库将不能检查密码也不能返回一个有效用户名的记录。
避免这些可以通过检查---和'在用户名里的并且不理这些请求。最好的办法就是避开这些字符串,像对待其他字符一样对待---和,。
好了,常见的几个PHP的注意事项就说完了,其实网络的Web服务器是非常容易暴露给攻击者的,假如PHP代码到处是漏洞的话,就是有再好的防火墙也是没用的。所以,希望大家在编写程序的时候能够真正重视PHP的安全问题!