asp.net(C#)防sql注入组件的实现代码

 

from:

http://www.codesky.net/article/doc/201004/2010041706888.htm

 

 

一些通用的防注入方法中没有对cookie数据进行过滤,会给黑客留下可乘之机。当然我的这段代码对提交过来的cookie数据也进行了过滤。 
代码: 

复制代码代码如下:

using System; 
using System.Configuration; 
using System.Web; 
using System.Globalization; 
namespace JNYW.StuM.SqlInject 

public class SqlstrAny : IHttpModule 

public void Init(HttpApplication application) 

application.BeginRequest += (new 
EventHandler(this.Application_BeginRequest)); 

private void Application_BeginRequest(Object source, EventArgs e) 

ProcessRequest pr = new ProcessRequest(); 
pr.StartProcessRequest(); 

public void Dispose() 



public class ProcessRequest 

private static string SqlStr = System.Configuration.ConfigurationManager.AppSettings["SqlInject"].ToString();
private static string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["SQLInjectErrPage"].ToString();
/// 
/// 用来识别是否是流的方式传输 
/// 
/// 
/// 
bool IsUploadRequest(HttpRequest request) 

return StringStartsWithAnotherIgnoreCase(request.ContentType, "multipart/form-data"); 

/// 
/// 比较内容类型 
/// 
/// 
/// 
/// 
private static bool StringStartsWithAnotherIgnoreCase(string s1, string s2) 

return (string.Compare(s1, 0, s2, 0, s2.Length, true, CultureInfo.InvariantCulture) == 0); 

//SQL注入式攻击代码分析 
#region SQL注入式攻击代码分析 
/// 
/// 处理用户提交的请求 
/// 
public void StartProcessRequest() 

HttpRequest Request = System.Web.HttpContext.Current.Request; 
HttpResponse Response = System.Web.HttpContext.Current.Response; 
try 

string getkeys = ""; 
if (IsUploadRequest(Request)) return; //如果是流传递就退出 
//字符串参数 
if (Request.QueryString != null) 

for (int i = 0; i < Request.QueryString.Count; i++) 

getkeys = Request.QueryString.Keys[i]; 
if (!ProcessSqlStr(Request.QueryString[getkeys])) 

Response.Redirect(sqlErrorPage + "?errmsg=QueryString中含有非法字符串&sqlprocess=true"); 
Response.End(); 



//form参数 
if (Request.Form != null) 

for (int i = 0; i < Request.Form.Count; i++) 

getkeys = Request.Form.Keys[i]; 
if (!ProcessSqlStr(Request.Form[getkeys])) 

Response.Redirect(sqlErrorPage + "?errmsg=Form中含有非法字符串&sqlprocess=true"); 
Response.End(); 



//cookie参数 
if (Request.Cookies != null) 

for (int i = 0; i < Request.Cookies.Count; i++) 

getkeys = Request.Cookies.Keys[i]; 
if (!ProcessSqlStr(Request.Cookies[getkeys].Value)) 

Response.Redirect(sqlErrorPage + "?errmsg=Cookie中含有非法字符串&sqlprocess=true"); 
Response.End(); 




catch 

// 错误处理: 处理用户提交信息! 
Response.Clear(); 
Response.Write("CustomErrorPage配置错误"); 
Response.End(); 


/// 
/// 分析用户请求是否正常 
/// 
/// 传入用户提交数据 
/// 返回是否含有SQL注入式攻击代码 
private bool ProcessSqlStr(string Str) 

bool ReturnValue = true; 
try 

if (Str != "") 

string[] anySqlStr = SqlStr.Split('|'); 
foreach (string ss in anySqlStr) 

if (Str.IndexOf(ss) >= 0) 

ReturnValue = false; 
break; 




catch 

ReturnValue = false; 

return ReturnValue; 

#endregion 


在实际使用时,我们要在Web.config文件中的配置节中加上下面的代码 
以下是示例代码: 
复制代码代码如下:

<!--防注入设置--> 
<add value="and |exec |insert |select |delete |update |count | * |chr |mid |master |truncate |char |declare " key="SQLInject" /> 
<add value="ShowErr.aspx" key="SQLInjectErrPage" /> 

并且在Web.Config文件的<SYSTEM.WEB>中再加上下面的代码。 以下是示例代码: 
复制代码代码如下:

<!--防注入设置--> 
<HTTPMODULES> 
<aDD name="SqlstrAny" type="JNYW.StuM.SqlInject.SqlstrAny,SqlstrAny" /> 
</HTTPMODULES> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值