对于WEB程序项目,有时候接收的参数变量比较多,如果一个个去check会非常麻烦,请问有没有一种比较简单的方法来避免。

2010-10-27 04:14:03

15 Answers

XSS:又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。

一般寻找跨站攻击的地方是找有表单输入的地方;然后提交一段脚本语言,比如javascript、vbscript等;这样可以获得用户和管理员的Cookie信息、挂马、钓鱼。

有了管理员的Cookie信息,有时能对web后台操作,发布一些信息获得用户的Cookie或给用户挂马。
挂马是向页面中加入恶意转向代码,当你访问被加入恶意代码的页面时,你就会自动的访问被转向的地址或者下载木马病毒。
防御方法过滤掉"<"、">"、"\"、以及单双引号就行,使用htmlspecialchars函数做过滤。

上传漏洞:主要分为两大类,一类是没有对上传格式做很好的限制,比如linux环境下上传个php的木马,过滤方法不能使用排除法,因为有些扩展名是不能预料到的。比如.php3,.php4也可以当做php网页来执行。要限制住只能使用某某扩展名,比如".JPG"、".BMP"、".GIF"。而且要再服务端做校验,不要紧紧用客户端脚本,因为可以修改发送的封包的,把封包中的muma.php.JPG修改为muma.php。
一类是网页嵌入图片时,没有使用标签链接图像地址,而是把图片内容包含在网页中,这样就可以构造恶意的图片内容来搞破坏了,比如:
GIF89a.
访问这个网页会加载图片,就跳到挂有木马的http://www.hacker.com/ 网站了。
这一点,平台部的兄弟们做得很好,不管上传什么,一律把文件生成缩略图快照,两类上传漏洞都防住了。

其它的CSRF、Session Hijacking、HTTP Response Splitting -HTTP响应拆分攻击、Flash溢出跨站等比较难利用,一般不容易中招。

另外防止SQL还需设置php.ini文件中的display_errors = Off,因为通过构造一些恶意的SQL语句造成网页显示错误信息,而错误信息又包括一些敏感的信息,比如数据库表名、字段名等就不好了。

2010-10-27 06:28:06

看到的一个WEB SERVER介绍。

Hiawatha是一种能够提供更强安全特性的Unix网络服务器,由Hugo Leisink在2002年开发,如今仍不断升级。上一个稳定的升级版本是v7.0,2010年2月发布。虽然Hiawatha主要为适用PHP环境而改进,它能够支持所有CGI/Fast CGI应用。Hiawatha提供许多安全特性,其中包括:

防止SQL注入
防止CSRF攻击
防止DoS阻断服务攻击
预防黑客潜入
限制CGI应用的运行时间

Hiawatha网络服务器可以运行于Linux、BSD、MacOS X和Windows环境。

http://en.wikipedia.org/wiki/Hiawatha_webserver

2010-10-27 09:46:04

用PDO,所有的sql都要用prepareStatement方法来组合,而不是自己手工组合,不仅安全,而且高效

2010-10-27 11:25:28

为了防止用户的错误数据和 php + mysql 注入 ,这是我以前常用的一个函数,在这个函数中,有三个参数:
 $pi_strName: 变量名
 $pi_Def: 默认值
 $pi_iType: 数据类型。取值为 XH_PARAM_INT, XH_PARAM_TXT, 分别表示数值型和文本型。
   如果请求是数值型,那么调用 is_numeric() 判断是否为数值。如果不是,则返回程序指定的默认值。
   简单起见,对于文本串,我将用户输入的所有危险字符(包括HTML代码),全部转义。由于 php 函数 addslashes()存在漏洞,我用 str_replace()直接替换。get_magic_quotes_gpc() 函数是 php 的函数,用来判断 magic_quotes_gpc 选项是否打开。

PAPI_GetSafeParam(),用来获取安全的参数值: define("XH_PARAM_INT",0); define("XH_PARAM_TXT",1); function PAPI_GetSafeParam($pi_strName, $pi_Def = "", $pi_iType = XH_PARAM_TXT) { if ( isset($_GET[$pi_strName]) ) $t_Val = trim($_GET[$pi_strName]); else if ( isset($_POST[$pi_strName])) $t_Val = trim($_POST[$pi_strName]); else return $pi_Def; // INT if ( XH_PARAM_INT == $pi_iType) { if (is_numeric($t_Val)) return $t_Val; else return $pi_Def; } // String $t_Val = str_replace("&", "&amp;",$t_Val); $t_Val = str_replace("<", "&lt;",$t_Val); $t_Val = str_replace(">", "&gt;",$t_Val); if ( get_magic_quotes_gpc() ) { $t_Val = str_replace("\\\"", "&quot;",$t_Val); $t_Val = str_replace("\\''", "&#039;",$t_Val); } else { $t_Val = str_replace("\"", "&quot;",$t_Val); $t_Val = str_replace("'", "&#039;",$t_Val); } return $t_Val; }      刚才第二节的示例,代码可以这样调用: <? if ( isset($_POST["f_login"] ) ) { // 连接数据库... // ...代码略... // 检查用户是否存在 $t_strUid = PAPI_GetSafeParam("f_uid", 0, XH_PARAM_INT); $t_strPwd = PAPI_GetSafeParam("f_pwd", "", XH_PARAM_TXT); $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1"; if ( $t_hRes = mysql_query($t_strSQL) ) { // 成功查询之后的处理. 略... } } ?>
2010-10-27 12:04:21

一般SQL注入防范对策有如下几点:
1、输入检查,也就是要对传递过来的参数进行检查,过滤非法字符;
2、存储过程,就是建议使用存储过程来代替一些sql语句;
3、参数化SQL,尽量少用字符串拼接的办法来生成sql语句,而是通过prepareStatement之类的方法来进行组合;
4、屏蔽错误信息,就是如果出错或异常就转跳到指定的错误页面,而不是让错误信息直接返回给客户端;
5、数据库权限,合理配置数据库的权限;
6、静态化/伪静态化,能做成静态的尽量做成静态或伪静态。

2010-10-27 13:53:20

给一个php版本的,不是很全面,不过一般的过滤已经足够了。

/**
@param string $val--过滤的参数
@param string $type--过滤类型int|string|html
@param string $method--post|get|request
@return mixed
**/

function filter_val($val,$type='int',$method='post'){
        $arr = array();
    switch (strtoupper($method)) {
        case 'POST':
        $arr = $_POST;
            break;
        case 'GET':
            $arr = $_GET;
        break;
        case 'REQUEST':
            $arr = $_REQUEST;
        break;
        default:
        break;  
    } 
    
    if (isset($arr["$val"])) {
        if ($type == 'int') {
            return intval($arr["$val"])?intval($arr["$val"]):0;
        } elseif ($type == 'string') {
        return empty($arr["$val"])?false:mysql_escape_string(strip_tags($arr["$val"]));
        } elseif ($type == 'html') {
        return empty($arr["$val"])?false:addslashes(strip_tags($arr["$val"]," 
 
	 "));
        }
     } else {           
         return false;
    }
}  

//以前用过一个雅虎用的专门检测的php的扩展,很繁琐,对于一般的项目没有必要那么严谨。
2010-10-27 15:12:27
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制