/// ***************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. ThinkPHP 3.2.3 ----- 验证码

    显示验证码 首先在Home/Controller下创建一个公共控制器PublicController 1 <?php 2 namespace Home\Controller; 3 4 use T ...

  2. PHP基础12:数组

    <?php //1.实例 $array = array("VOLVO","BMW","SASS"); for ($i=0; $i &l ...

  3. Android强制弹出,隐藏输入法.

    当我们弹出一个Dialog时候,如果这个Dialog需要输入数据,然后确定后又需要关闭输入法,一般系统的hide,跟show方法总会有各种问题,最霸道的解决方法就是写一个定时器,定时弹出或者关闭输入法 ...

  4. ultraEdit32 /uedit32 自定义快捷键/自定义注释快捷键

    编辑器一直用vim,但同事写VHDL 用的是utraledit32 ,为了更好的沟通,我也下载了最新破解版本:http://pan.baidu.com/s/1qWCYP2W 刚开始用找不到注释的快捷键 ...

  5. Linux常用指令---工作

    查看所有用户cat /etc/passwd 复制整个目录cp -ri A/B/* A1/B1/ 若复制过程中询问是否覆盖,输入y按回车 另外若A A1不在同一目录下,最好填绝对路径,就是/xxx/xx ...

  6. 3.SQLAlchemy文档-SQLAlchemy Core(中文版)

    这里的文描述了关于SQLAlchemy的的SQL渲染引擎的相关内容,包括数据库API的集成,事务的集成和数据架构描述服务.与以领域为中心的ORM使用模式相反,SQL表达式语言提供了一个数据构架为中心的 ...

  7. HTML5 IE兼容问题

    最近,为公司做产品的时候用到了HTML5,用IE11打开的时候出现了界面乱或者加载js错误的问题. IE10 or IE11 :Browser Mode is IE10 .Document Mode: ...

  8. WINDOWS下用脚本运行redis和mongodb

    开发环境每次开麻烦,又不想建service,用bat最简单 @echo off echo 打开NOSLQ服务 start E:\nosql\mongodb\mongod.exe -dbpath e:\ ...

  9. 免费的SSL证书,免费为微信小程序搭建https

    StartSSL 也免费提供了一个证书(纯英文) 申请地址:https://www.startssl.com/Account?r=L1ZhbGlkYXRl 阿里云免费提供的证书 https://com ...

  10. Lua语言的特别之处

    所谓特别,是相对的,是相对别的主流语言而言,有些也可能只是我个人看法. 1. 函数定义与调用,与代码位置的先后顺序有关,例如 calculate() function calculate() .... ...