/// ***************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. C语言 后缀自增的优先级详解

    // ++ 后缀自增与取地址& ,提领 * (指针里的操作符)的优先级比较 #include<stdio.h> #include<stdlib.h> #include& ...

  2. U3D临时文件GICache巨大

    C:\Users\asus\AppData\LocalLow\Unity\Caches\GiCache 看名字似乎是全局光的缓存,可以通过Edit - Preference - GI Cache,选中 ...

  3. .NET性能调优之一:ANTS Performance Profiler的使用

    .NET性能调优系列文章 系列文章索引 .NET性能调优之一:ANTS Performance Profiler的使用 .NET性能调优之二:使用Visual Studio进行代码度量 .NET性能调 ...

  4. python 反模式

    不使用 pythonic 的循环: l = [1,2,3] #Bad for i in range(0,len(list)): le = l[i] print(i,le) #Good for i,le ...

  5. JS 模板引擎之JST模板

    项目中有用到JST模板引擎,于是抽个时间出来,整理了下关于JST模板引擎的相关内容. 试想一个场景,当点击页面上列表的翻页按钮后,通过异步请求获得下一页的列表数据并在页面上显示出来.传统的JS做法是编 ...

  6. Ubuntu 14.04 下安装google的浏览器——Chrome

    小编用过好多浏览器,但最后还是选择Chrome, 因为这款浏览器确实做的不错,可是Ubuntu下自带的是火狐,因此小编在这里和大家分享一下如何在Ubuntu下安装chrome浏览器 工具/原料   安 ...

  7. 做leetcode的几点体会分享(转)

    1 大部分题目你都是可以自己做出来的.所以,第一遍尽量不要网上找答案: 2 写了的不管通过的,不通过的答案要保存下来.不通过的,也要记录下来哪儿没有通过.很有可能你这次错了,不知道怎么搞过了,下次还是 ...

  8. C/C++程序从编译到链接的过程

    编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...

  9. Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少. 比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找 ...

  10. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...