关注PHP安全
发布人:zicky 时间:2007-11-29 22:54 来源: Php Question 查看: 234次
1、SQL注入。一下是最常见的一个例子:
SELECT * FROM users WHERE name='$username' AND pass='$password';
结果当$password = ' OR '1'='1 时,该SQL就变成
SELECT * FROM users WHERE name='known_user' AND pass='' OR '1'='1';
该SQL将会把USERS的表记录全部查询,这样USER就可以饶过该验证进入下一关。
当然我们有很多方法在验证用户合法性上,这里主要要说的是输入,而不是验证。
就是因为USER随意输入了',"等会在一般情况下会造成系统困惑的符号而造成的。所以我们需要针对这类问题进行
相应的处理。
PHP提供了addslashes函数可对输入进行转义,例如'变成\',"变成\";同时PHP.INI也有个魔术常量可达到相同的
效果,magic_qutoes_gpc,该常量在目前版本默认是On,也就是说默认是可进行转换的。但这个会造成一个问题
就是当我们不需要进行转换的时候,它还是执行了转换。所以有时候我们会把它设置为Off,或者通过如下代码进行
控制。
if (get_magic_quotes_gpc()){
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
}先判断该常量是否打开,如果是通过array_map函数,调用stripslashes函数对数组进行转换。转换完后,我们再
对这几个数组的值进行必要的转义。具体采用哪一种可自行决定。
前面讲到输入过滤,现在谈谈输出转义
假设你把用户输入的记录原封不动的保存到你的数据库里
如下代码:
<script>
window.location.href='get.php?cookie='+document.cookie;
</script>
这样,当其他用户在访问显示该笔记录的页面时,页面执行到该处,就会自动跳转到
get.php,并且把当前USER所使用的COOKIE传递过来。
说到这里,我想这时候的cookie就已经不是秘密了。相信很多程序都是把类似的密码等存放到
cookie,如果密码等重要信息不加密或者加密不严格,那该密码就失去了意义了。
所以最好是在输出的时候采用
htmlentities()函数把该笔记录转义后在echo出来。
接下来谈控制文件上传的几个问题
1、控制文件的大小。
可以通过修改php.ini 的 post_max_size 来控制大小 ,或者通过函数filesize判断上传文件大小来限制。但是
filesize函数有局限,就是当文件大小超过2G的时候则失效。
2、控制文件上传的类型。
比如一些EXE、COM文件,甚至是PHP文件也加以禁止。这个可通过判断文件的扩展名获得。
3、修改文件的名称
所谓修改文件的名称是指上传后,实际上保存在服务器的名称是经过程序转换,但显示的名称依然是上传的
名称。
4、如果允许所有类型被上传,则上传时修改其扩展名,才保存到服务器。



