1. 非法的数据过滤
1.1 数据检查:
通过链接传递的常数你永远要假定它可以是任意的值。一个合格的程序,它首先有一套过滤系统,过滤数据的有效性。
一般来说,在js 的客户端,会有一个过滤,提示你输入了非法的数据,但是js很容易被绕过,所以,服务器端还要执行相同的检查。
一般检查的项目如下:
1. 是否是布尔类型
2. 是否是一个字母
3. 是否是整数
4. 是否是小数
5. 是否是个email
6. 是否是个url
7. 是否是个正确的电话号码
8. 是否是一个正确的用户名
经过数据过滤后,数据的安全性大大提高了。比如下面的情况就不会发生:
SELECT * FROM table WHERE id= $id
我把id改成 “1 or 1”
那就把表中所有的数据都显示出来了。
因为ID 是 int 类型的限制,所以,1 or 1 是个非法的数据。
1.2 文件检查:
当然,这样的数据过滤,并不完全。看下面的例子:
readfile($_GET[‘file’]);
$_GET[‘file’] 是一个文件,没有错,或许用户传递的是对的。但是
这样的情况可能发生
readfile(“/etc/passwd”)
这就很危险了。
如果,要控制用户读写文件,必须要限制用户能读写的目录。在该目录下读写任何文件是安全的。
1.3 防止SQL 注入:
同样的,一个很典型的例子是SQL 里面的例子:
SELECT * FROM table WHERE use r= ‘$user’
从数据检查的角度来说,用户输入wang‘s 这样的语句是正确的,但是,如果是输入这样的数据,上面的SQL 会有错误,而且还不能保证安全。我们要把 ‘ 替换成 \’ 。PHP 中提供了很多相关的解决方案,看看PHPWIND 的解决方案:
if (!get_magic_quotes_gpc()) {
Add_S($_POST);
Add_S($_GET);
Add_S($_COOKIE);
}
Add_S($_FILES);
其中ADD_S 函数如下:
function Add_S(&$array){
if (is_array($array)) {
foreach ($array as $key => $value) {
if (is_array($value)) {
Add_S($array[$key]);
} else {
$array[$key] = addslashes($value);
}
}
}
}
1.4 防止跨站脚本攻击:
很多系统,你输入一段JS 代码的评论,居然能够正常执行。这是一件很危险的事情,很多时候,你就可以利于你的JS 默默的做坏事,偷取别人的帐户信息。
这样的脚本,能正常保存进入数据库,而且对服务器没有任何的伤害,但是,对用户来说,这是个灾难。
在PHP中,可以简单的用htmlspecialchars这个函数进行解决。
当然很多时候,有一个矛盾,就是允许用户通过html 进行编写。博客园就有这样的漏洞。实际上,只要你们访问我的博客,我就有办法获取你的cookie,进而,我通过这个cookie,我就可以给你发布一个征婚的信息。
解决用户需要html 的情况是通过
1. 自定义一些标记,比如discuz 的解决方案。不允许填入html标签。
2. 小心的过滤掉<script> 的标签,这样危险的标签最好不要存在。
3. 对外部的图片,一定要十分的小心。很有可能,它会是病毒。最好,服务器端在用户加入外部图片的第一次,对图片进行检查(我一般会用gd 库 对图片进行大幅度的缩放,如果能正常缩放,嵌入病毒的可能性比较的小,我对病毒的知识了解比较少,不知道怎么判断一个图片是否包含恶意代码),并进行缓存。避免读取不安全的图片。
原文链接:https://www.cnblogs.com/niniwzw/archive/2010/01/28/1658383.html
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/18088