/// ***************C#版SQL防注入程序 v1.0************

/// *使用方法:

/// 一、整站防注入(推荐)

/// 在Global.asax.cs中查找Application_BeginRequest函数加入代码,如下

///   protected void Application_BeginRequest(Object sender, EventArgs e)

///              {

///             //防SQL注入代码

///             SqlInject myCheck = new SqlInject(this.Request);

///             myCheck.CheckSqlInject();

///              }

/// 二、单独页面防注入

/// 在要保护的页面cs文件的Page_Load函数中加入代码,如下:

///     protected void Page_Load(object sender, EventArgs e)

///     {

///             SqlInject myCheck = new SqlInject(this.Request);

///             myCheck.CheckSqlInject();

///     }

/// 三、基本设置

/// 1.修改private const int _type = 3 的_type参数来设置Sql注入警告及日志记录方式;

/// 2.修改string errRedirectPage = "/err.aspx" 来设置自定义错误处理页面;

/// 3.如果_type=1或者3,那么请务必设置string errMDBpath = "/SqlInject.mdb"相应的日志数据库路径;

/// 4.如果采取默认程序,那么请将本程序对应的SqlInject.mdb放至网站系统根目录下。

///

/// *版权说明:

/// 一、部分代码参考Asp版Sql通用防注入程序3.2 Neeao站点:http://www.neeao.com

/// 二、大部分核心代码参考网上匿名.NET防注入代码,感谢

/// 三、此代码下载和更新站点:www.wbyj.com

/// ***********************************

/// </summary>

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.OleDb;

using System.Text.RegularExpressions;

public class SqlInject : System.Web.UI.Page

{

//检测到注入后的处理方式:   0:仅警告;1:警告+记录;2:警告+自定义错误页面;3:警告+记录+自定义错误页面

private const int _type = 3;

private const string errRedirectPage = "/err.aspx";

//如果记录注入信息,那么请设置:errMDBpath:数据库路径

private const string errMDBpath = "/SqlInject.mdb";

//过滤特征字符

private const string StrKeyWord=@"select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec|master|net local group administrators|net user|or|and";

private const string StrRegex=@"-|;|,|/|(|)|[|]|{|}|%|@|*|'|!";

private HttpRequest request;

public SqlInject(System.Web.HttpRequest _request)

{

this.request=_request;

}

///<summary>

///检测SQL注入及记录、显示出错信息

///</summary>

public void CheckSqlInject()

{

bool isInject = false;

if (CheckRequestQuery() || CheckRequestForm())

{

isInject = true;

}

else

{

return;

}

switch (_type)

{

case 0:

ShowErr();

break;

case 1:

ShowErr();

SaveToMdb();

break;

case 2:

ShowErr();

string temp;

System.Web.HttpContext.Current.Response.Write("<script>setTimeout(\""+"location.href='"+errRedirectPage+"'"+"\",5000)</script>");

break;

case 3:

ShowErr();

SaveToMdb();

System.Web.HttpContext.Current.Response.Write("<script>setTimeout(\"" + "location.href='" + errRedirectPage + "'" + "\",5000)</script>");

break;

default:

break;

}

System.Web.HttpContext.Current.Response.End();

}

private void SaveToMdb()

{

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + Server.MapPath(errMDBpath));

conn.Open();

OleDbCommand cmd = conn.CreateCommand();

cmd.CommandText = "insert into [Record] (sIP,sDate,sPath) values ('" +

request.ServerVariables["REMOTE_ADDR"].ToString() + "','" +

DateTime.Now + "','" + request.ServerVariables["URL"].ToLower() + RelaceSingleQuotes(request.QueryString.ToString()) + "')";

int code = cmd.ExecuteNonQuery();

if (code==1)

System.Web.HttpContext.Current.Response.Write("<br>****以上信息已记录至日志数据库****");

else

System.Web.HttpContext.Current.Response.Write("<br>日志数据库出错");

conn.Close();

}

private string RelaceSingleQuotes(string _url)

{

string URL=_url.Replace("'","单引号");

return URL;

}

private void ShowErr()

{

string msg = @"<font color=red>请不要尝试未授权之入侵检测!</font>" + @"<br><br>";

msg += @"操作IP:" + request.ServerVariables["REMOTE_ADDR"] + @"<br>";

msg += @"操作时间:" + DateTime.Now + @"<br>";

msg += @"页面:" + request.ServerVariables["URL"].ToLower() + request.QueryString.ToString() + @"<br>";

msg += @"<a href='#' onclick='javascript:window.close()'>关闭</a>";

System.Web.HttpContext.Current.Response.Clear();

System.Web.HttpContext.Current.Response.Write(msg);

}

///<summary>

/// 特征字符

///</summary>

public static string KeyWord

{

get {

return StrKeyWord;

}

}

///<summary>

/// 特征符号

///</summary>

public static string RegexString

{

get {

return StrRegex;

}

}

///<summary>

///检查字符串中是否包含Sql注入关键字

/// <param name="_key">被检查的字符串</param>

/// <returns>如果包含注入true;否则返回false</returns>

///</summary>

private static bool CheckKeyWord(string _key)

{

string[] pattenString = StrKeyWord.Split('|');

string[] pattenRegex = StrRegex.Split('|');

foreach (string sqlParam in pattenString)

{

if (_key.Contains(sqlParam + " ") || _key.Contains(" " + sqlParam))

{

return true;

}

}

foreach (string sqlParam in pattenRegex)

{

if (_key.Contains(sqlParam))

{

return true;

}

}

return false;

}

///<summary>

///检查URL中是否包含Sql注入

/// <param name="_request">当前HttpRequest对象</param>

/// <returns>如果包含注入true;否则返回false</returns>

///</summary>

public bool CheckRequestQuery()

{

if (request.QueryString.Count > 0)

{

foreach (string sqlParam in this.request.QueryString)

{

if (sqlParam == "__VIEWSTATE") continue;

if (sqlParam == "__EVENTVALIDATION") continue;

if (CheckKeyWord(request.QueryString[sqlParam].ToLower()))

{

return true;

}

}

}

return false;

}

///<summary>

///检查提交的表单中是否包含Sql注入

/// <param name="_request">当前HttpRequest对象</param>

/// <returns>如果包含注入true;否则返回false</returns>

///</summary>

public bool CheckRequestForm()

{

if (request.Form.Count > 0)

{

foreach (string sqlParam in this.request.Form)

{

if (sqlParam == "__VIEWSTATE") continue;

if (sqlParam == "__EVENTVALIDATION") continue;

if (CheckKeyWord(request.Form[sqlParam]))

{

return true;

}

}

}

return false;

}

}

SQL防注入程序 v1.0的更多相关文章

  1. SQL防注入程序

    1.在Global.asax.cs中写入: protected void Application_BeginRequest(Object sender,EventArgs e){      SqlIn ...

  2. PHP之SQL防注入代码集合(建站常用)

    SQL防注入代码一 <?php if (!function_exists (quote)) { function quote($var) { if (strlen($var)) { $var=! ...

  3. sql 防注入 维基百科

    http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A SQL攻击(SQL inj ...

  4. php之防注入程序绕过浅谈

    <?php/*判断传递的变量是否含有非法字符如:$_POST/$_GET功能:SQL防注入系统*/ //屏蔽错误提示error_reporting(7); //需要过滤的字符 $ArrFiltr ...

  5. 特殊字符的过滤方法,防sql防注入代码的过滤方法

    特殊字符的过滤方法 function strFilter($str){ //特殊字符的过滤方法 $str = str_replace('`', '', $str); $str = str_replac ...

  6. php-sql-parser sql防注入脚本

    <?php /** * SQL Parser from: http://code.google.com/p/php-sql-parser/ * License: New BSD */ class ...

  7. QT-利用C++仿制windown自带的记事本程序V1.0

    下班无事, 发现QT还是很好用的, 就仿制windows的记事本做了一个,未彻底DEBUG, 先拿来分享下. windows记事本大概是这样的: 大概分为以下几步: 1. 界面用QT代码写,即可, Q ...

  8. PHP SQL防注入

    过年前后在做一个抽奖的东西,需要用户填写中奖信息,为了防止非法用户对数据库进行入侵神马的,于是写下基本的防注入语句,需要用的可以自己封装成一个function. $str = str_replace( ...

  9. PHP安全、Sql防注入安全汇总

    利用Mysqli和PDO 产生原因 主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT ...

随机推荐

  1. .NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

  2. 团购、定时抢购倒计时js版

     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org ...

  3. scrapy 登录

    说明: 本文参考了官网文档,以及stackoverflow的几个问题 注意: 下面这个爬虫不能实际运行!我只是用它来展示登录,以及之后如何处理. 方式一:FormRequest import scra ...

  4. matlab 中的textscan

    textread 与textscan的区别  textscan更适合读入大文件: textscan可以从文件的任何位置开始读入,而textread 只能从文件开头开始读入: textscan也可以从上 ...

  5. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  6. 使用OneNote的COM组件,实现OCR功能。

    背景 在业务系统开发的过程中,很多情况下会去识别图片中的相关信息,并且把信息录入到系统中.现在希望通过自动化的方式录入,就有了以下的工作.在对比了几个OCR软件在中文识别方面的准确率后,决定使用微软的 ...

  7. sublime2的一些基本常用的操作

    1.全局搜 ctrl shift f 如果你的快捷键有冲突的话,那么你在find的菜单中有find in file这个中找.

  8. 一头扎进EasyUI

    惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 一头扎进EasyUI第1讲 .加载库文件和样式 <link rel="stylesheet" ...

  9. RequireJS实例分析

    随着JS越来越庞大,已经不仅仅是以前复制粘贴做特效的时代了,JS越来越偏向于业务逻辑与应用.恰逢Node的流行,JS在web开发中占有越来越重要的地位.由于JS代码庞大,文件数目多,传统的使用< ...

  10. java设计优化--观察者模式

    观察者模式介绍 观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用.如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停 ...