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

在服务器安全栏目里我写过一篇《破解通用Sql防注入方法》的文章中说到,一些通用的防注入方法中没有对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)

相关推荐

  • C#简单快速的json组件fastJSON使用介绍

    JSON数据格式简洁,用于数据的持久化和对象传输很实用.最近在做一个Razor代码生成器,需要把数据库的表和列的信息修改后保存下来,想到用JSON序列化对象并保存,需要时再反序列化成对象会简单一些.codeplex上发现了fastJSON项目,好像很不错的样子.这里是作者做的性能测试: 代码调用 复制代码 代码如下: namespace test { class Program { static void Main(string[] args) { var zoo1 = new zoo(); z

  • C#实现自定义定时组件的方法

    本文实例展示的是一个自定义的定时器组件,有别于.NET Framework里面提供的几个Timer.首先说说该组件开发背景,发现现在手头上的工作离不开定时,定时做一个任务,什么都是定时去做什么什么,隔某段时间干某件事情,都离不开"定时"这个词.众所周知这个要用到多线程,在多篇关于多线程的文章里面有提过做一些周期性的操作时最好用Timer,当然这个Timer肯定是Threading.Timer,并不是WinForm控件里面的Timer.但我觉得在我的应用中Timer不够满足需求. 1.T

  • 适用于WebForm Mvc的Pager分页组件C#实现

    本文为大家分享了自己写的一个Pager分页组件,WebForm,Mvc都适用,具体内容如下 分页控件其实就是根据链接在页面间传递参数,因为我看到MVC中你可以看到这样传递参数的new {para=val}这种方式传递参数,于是我想到用可以模仿这种传递参数的方式,那就用dynamic来作为参数对象传递. 下面是附上我写的具体的实现的代码 数据处理代码: 1.定义IPagedList接口 using System; using System.Collections.Generic; using Sy

  • C#编写发送邮件组件

    在MailSetting里的配置好邮件服务器,然后MailEntity里配置好要发送的邮件主体,最后使用MailServer里的方法Send发送邮件 MailEntity.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace AutoOutTicket.Mail { public class MailEntity { public string from

  • C# 重写ComboBox实现下拉任意组件的方法

    一.需求 C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉. 二.设计 基本思路:重写ComboBox,将原生的下拉部分屏蔽,使用toolStripDropDown制作下拉弹出 三.问题解决 1. 问题:toolStripDropDown中放toolStripControlHost时会有边框产生,同时CheckedListBox的duck为full时底端会有很大空白 解决: toolStripControlHos

  • C#读取文本文件到listbox组件的方法

    本文实例讲述了C#读取文本文件到listbox组件的方法.分享给大家供大家参考.具体实现方法如下: private void AddTxtToLst(string path,ListBox lst) { StreamReader file = new StreamReader(path,Encoding.Default); string s = ""; while (s != null) { s = file.ReadLine(); if (!string.IsNullOrEmpty(

  • C#中WPF使用多线程调用窗体组件的方法

    本文实例讲述了C#中WPF使用多线程调用窗体组件的方法.分享给大家供大家参考.具体如下: Thread thread=new Thread(new ThreadStart(TestThread)); thread.Start(); private void TestThread() { for (int i = 0; i < 11;i++ ) { Thread.Sleep(2000); this.listBox1.Dispatcher.Invoke(new Action(() => { thi

  • C# 无需COM组件创建快捷方式的实现代码

    看了一下手中的一些小工具, 很多都是单文件但可以创建快捷方式, 于是翻遍 Google, 最后终于在俄罗斯论坛 RSDN 找到了一个很强大的类. 类文件下载: http://asen.googlecode.com/files/Shortcut.cs (无注释精简版)RSDN 原帖: http://www.rsdn.ru/forum/src/3098615.flat.aspx (带英文注释) 使用方法很简单, 把这个文件添加到你的项目中, 然后用法跟 COM 组件那个类似, 但稍有不同: 复制代码

  • C#编写COM组件的方法分析

    本文实例讲述了C#编写COM组件的方法.分享给大家供大家参考,具体如下: 1.新建一个类库项目 2.将Class1.cs改为我们想要的名字 问是否同时给类改名,确定 3.修改Properties目录下面的AssemblyInfo.cs ComVisible属性设置为True 4.项目菜单->MyLib属性 找到"生成"选项卡 往下看,找到"为 COM Interop 注册"勾上 5.继续往下,找到"签名"选项卡   勾上"为程序集

  • c#创建vc可调用的com组件方法分享

    开发工具:VS2008 VS2008命令提示符(呵呵,这个你应该可以找到在什么地方吧) 附:本文适用任何VS系列工具. 在用C#创建COM时,一定要记住以下几点: 1:所要导出的类必须为公有: 2:所有属性.方法也必须为公有: 3:要导出的属性.方法必须用接口方式:如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM.但他们可以被别的.NET程序所使用: 4:所有的事件也必须用接口方式: 现在我们开始正题: 一.新建一个Visual C#工程(习惯这种叫法了,现在应该叫解决方案

  • C# 中的动态创建组件(属性及事件)的实现思路及方法

    通常在写程序的时候,当要用到某些组件,采用的方法一般都是动态创建,用完以后就释放掉.Visual   C#在程序运行的时候也可以动态创建组件,下面就结合一个程序例子来具体介绍如何用Visual   C#动态生成组件.首先让我们了解一下,在动态创建组件的过程中要用到的一些概论和理论. 一.   Boxing   (装箱)和Unboxing   (出箱): 在用Visual   C#动态创建组件的时候,要涉及到二种数据类型变量的转换,这二种类型变量就是实值类型(Value   Type)变量和参考类

随机推荐