sql注入是被谈
![](/icons/34695de.gif)
很多
![](/icons/34695de.gif)
![](/icons/34695yi.gif)
个话题
![](/icons/34695dou.gif)
有很多
![](/icons/34695de.gif)
思路方法能够实现sql
![](/icons/34695de.gif)
防注入
![](/icons/34695dou.gif)
在这里就简单说
![](/icons/34695yi.gif)
下如果使用HttpModule来实现sql
![](/icons/34695de.gif)
防注入
在项目中添加
![](/icons/34695yi.gif)
个类让其实现IHttpModule接口
![](/icons/34695dou2.gif)
IHttpModule接口有两个思路方法 Init 和 Dispose
![](/icons/34695dou2.gif)
然后在Init思路方法中来订阅
AcquireRequestState事件
public void Dispose
{
}
public void Init(HttpApplication context)
{
//Begin_Request时还没有加载Session状态
context.AcquireRequestState
![](/icons/34695new.gif)
EventHandler(context_AcquireRequestState);
}
为什么是AcquireRequestState 事件而不是Begin_Request呢
![](/icons/34695dou.gif)
![](/icons/34695yinwei.gif)
在Begin_Request执行
![](/icons/34695de.gif)
时候还没有加载session状态
![](/icons/34695dou.gif)
而在处理
![](/icons/34695de.gif)
时侯
可能会用到session
在AcquireRequestState 事件中我们就要进行相应
![](/icons/34695de.gif)
处理了
![](/icons/34695dou.gif)
思路如下
![](/icons/34695dou.gif)
![](/icons/34695yi.gif)
般网站WebSite提交数据只有两个地方
![](/icons/34695dou.gif)
表单和url
![](/icons/34695dou.gif)
所有就在该事件中将从这两处
提交
![](/icons/34695de.gif)
数据截取
![](/icons/34695dou.gif)
判断是否有
![](/icons/34695yi.gif)
些危险
![](/icons/34695zifu.gif)
![](/icons/34695dou.gif)
然后做相应处理
![](/icons/34695dou2.gif)
代码如下
private void context_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
try
{
![](/icons/34695string.gif)
getkeys =
![](/icons/34695string.gif)
.Empty;
![](/icons/34695string.gif)
sqlErrorPage = "~/Error.aspx";//转向
![](/icons/34695de.gif)
![](/icons/34695cuowu.gif)
提示页面
![](/icons/34695string.gif)
keyvalue =
![](/icons/34695string.gif)
.Empty;
![](/icons/34695string.gif)
requestUrl = context.Request.Path.
![](/icons/34695ToString.gif)
![](/icons/34695kh.gif)
;
//url提交数据
![](/icons/34695if.gif)
(context.Request.QueryString != null)
{
for (
![](/icons/34695int.gif)
i = 0; i < context.Request.QueryString.Count; i
![](/icons/34695jiajia.gif)
)
{
getkeys = context.Request.QueryString.Keys[i];
keyvalue = context.Server.UrlDecode(context.Request.QueryString[getkeys]);
![](/icons/34695if.gif)
(!ProcessSqlStr(keyvalue))
{
context.Response.Redirect(sqlErrorPage);
context.Response.End
![](/icons/34695kh.gif)
;
![](/icons/34695break.gif)
;
}
}
}
//表单提交数据
![](/icons/34695if.gif)
(context.Request.Form != null)
{
for (
![](/icons/34695int.gif)
i = 0; i < context.Request.Form.Count; i
![](/icons/34695jiajia.gif)
)
{
getkeys = context.Request.Form.Keys[i];
keyvalue = context.Server.HtmlDecode(context.Request.Form[i]);//[getkeys];
![](/icons/34695if.gif)
(getkeys
![](/icons/34695dd.gif)
"__VIEWSTATE") continue;
![](/icons/34695if.gif)
(!ProcessSqlStr(keyvalue))
{
context.Response.Redirect(sqlErrorPage);
context.Response.End
![](/icons/34695kh.gif)
;
![](/icons/34695break.gif)
;
}
}
}
}
catch (Exception ex)
{
}
}
上面
![](/icons/34695de.gif)
代码只是做了简单
![](/icons/34695de.gif)
处理
![](/icons/34695dou.gif)
当然也可以在事件中将输入非法关键字
![](/icons/34695de.gif)
用户ip ,操作页面
![](/icons/34695de.gif)
url,时间等信息记录在数据库中或是记录在日志中
而且还用到了
![](/icons/34695yi.gif)
个叫ProcessSqlStr
![](/icons/34695de.gif)
思路方法
![](/icons/34695dou.gif)
这个思路方法就是用来处理
![](/icons/34695zifu.gif)
串
![](/icons/34695de.gif)
![](/icons/34695dou.gif)
判断是否合法
![](/icons/34695dou.gif)
如下
private bool ProcessSqlStr(
![](/icons/34695string.gif)
str)
{
bool
![](/icons/34695return.gif)
Value = true;
try
{
![](/icons/34695if.gif)
(str.Trim
![](/icons/34695kh.gif)
!= "")
{
//
![](/icons/34695string.gif)
sqlStr = ConfigurationManager.AppSettings["FilterSql"].Trim
![](/icons/34695kh.gif)
;
![](/icons/34695string.gif)
sqlStr = "declare |exec|varchar|cursor|begin|open |drop |creat |select |truncate";
![](/icons/34695string.gif)
![](/icons/34695zhk2.gif)
sqlStrs = sqlStr.Split('|');
foreach (
![](/icons/34695string.gif)
ss in sqlStrs)
{
![](/icons/34695if.gif)
(str.ToLower
![](/icons/34695kh.gif)
.IndexOf(ss) >= 0)
{
m_sqlstr = ss;
![](/icons/34695return.gif)
Value = false;
![](/icons/34695break.gif)
;
}
}
}
}
catch
{
![](/icons/34695return.gif)
Value = false;
}
![](/icons/34695return.gif)
Value;
}
到这儿类就写好了
![](/icons/34695dou.gif)
再在web.config中做相应
![](/icons/34695de.gif)
配置就大功告成
<httpModules>
<add type="HttpModule" name="HttpModule"/>
</httpModules>
用这种思路方法很方便
![](/icons/34695dou.gif)
只需在这
![](/icons/34695yi.gif)
处做处理
![](/icons/34695dou.gif)
全站都能应用到
![](/icons/34695dou.gif)
不过如果
![](/icons/34695yi.gif)
个用户想用varchar 等sql
![](/icons/34695de.gif)
关键字来做用户名注册
![](/icons/34695de.gif)
话也会被挡掉
不过应该没有人这么无聊吧
![](/icons/34695dou.gif)
呵呵.
延伸阅读
2008-12-8 at 19:04