网站编程中的常见安全问题(一)

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 库 对图片进行大幅度的缩放,如果能正常缩放,嵌入病毒的可能性比较的小,我对病毒的知识了解比较少,不知道怎么判断一个图片是否包含恶意代码),并进行缓存。避免读取不安全的图片。

posted @ 2010-01-28 15:07  暮夏  阅读(1073)  评论(3编辑  收藏  举报