c#.net全站防止SQL注入类的代码

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// 防SQL注入检查器
/// </summary>
public class SqlChecker
{
    //当前请求对象
    private HttpRequest request;
    //当前响应对象
    private HttpResponse response;
    //安全Url,当出现Sql注入时,将导向到的安全页面,如果没赋值,则停留在当前页面
    private string safeUrl = String.Empty;

//Sql注入时,可能出现的sql关键字,可根据自己的实际情况进行初始化,每个关键字由'|'分隔开来
    //private const string StrKeyWord = @"select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|""|or|and";
    private const string StrKeyWord = @"select|insert|delete|from|drop table|update|truncate|exec master|netlocalgroup administrators|:|net user|or|and";
    //Sql注入时,可能出现的特殊符号,,可根据自己的实际情况进行初始化,每个符号由'|'分隔开来
    //private const string StrRegex = @"-|;|,|/|(|)|[|]|}|{|%|@|*|!|'";
    private const string StrRegex = @"=|!|'";
    public SqlChecker()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
    /// <summary>
    /// 由此构造函数创建的对象,在验证Sql注入之后将停留在原来页面上
    /// </summary>
    /// <param name="_request">当前请求的 Request 对象</param>
    /// <param name="_response">当前请求的 Response 对象</param>
    public SqlChecker(HttpRequest _request, HttpResponse _response)
    {
        this.request = _request;
        this.response = _response;
    }
    /// <summary>
    /// 由此构造函数创建的对象,在验证Sql注入之后将请求将导向由 _safeUrl 指定的安全url页面上
    /// </summary>
    /// <param name="_request">当前请求的 Request 对象</param>
    /// <param name="_response">当前请求的 Response 对象</param>
    /// <param name="_safeUrl">验证Sql注入之后将导向的安全 url</param>
    public SqlChecker(HttpRequest _request, HttpResponse _response, string _safeUrl)
    {
        this.request = _request;
        this.response = _response;
        this.safeUrl = _safeUrl;
    }
    /// <summary>
    /// 只读属性 SQL关键字
    /// </summary>
    public string KeyWord
    {
        get
        {
            return StrKeyWord;
        }
    }
    /// <summary>
    /// 只读属性过滤特殊字符
    /// </summary>
    public string RegexString
    {
        get
        {
            return StrRegex;
        }
    }
    /// <summary>
    /// 当出现Sql注入时需要提示的错误信息(主要是运行一些客户端的脚本)
    /// </summary>
    public string Msg
    {
        get
        {
            string msg = "<script type='text/javascript'> "
            + " alert('请勿输入非法字符!'); ";

if (this.safeUrl == String.Empty)
                msg += " window.location.href = '" + request.RawUrl + "'";
            else
                msg += " window.location.href = '" + safeUrl + "'";

msg += "</script>";
            return msg;
        }
    }
    /// <summary>
    /// 检查URL参数中是否带有SQL注入的可能关键字。
    /// </summary>
    /// <returns>存在SQL注入关键字时返回 true,否则返回 false</returns>
    public bool CheckRequestQuery()
    {
        bool result = false;
        if (request.QueryString.Count != 0)
        {
            //若URL中参数存在,则逐个检验参数。
            foreach (string queryName in this.request.QueryString)
            {
                //过虑一些特殊的请求状态值,主要是一些有关页面视图状态的参数
                if (queryName == "__VIEWSTATE" || queryName == "__EVENTVALIDATION")
                    continue;
                //开始检查请求参数值是否合法
                if (CheckKeyWord(request.QueryString[queryName]))
                {
                    //只要存在一个可能出现Sql注入的参数,则直接退出
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
    /// <summary>
    /// 检查提交表单中是否存在SQL注入的可能关键字
    /// </summary>
    /// <returns>存在SQL注入关键字时返回 true,否则返回 false</returns>
    public bool CheckRequestForm()
    {
        bool result = false;
        if (request.Form.Count > 0)
        {
            //若获取提交的表单项个数不为0,则逐个比较参数
            foreach (string queryName in this.request.Form)
            {
                //过虑一些特殊的请求状态值,主要是一些有关页面视图状态的参数
                if (queryName == "__VIEWSTATE" || queryName == "__EVENTVALIDATION")
                    continue;
                //开始检查提交的表单参数值是否合法
                if (CheckKeyWord(request.Form[queryName]))
                {
                    //只要存在一个可能出现Sql注入的参数,则直接退出
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
    /// <summary>
    /// 检查_sword是否包涵SQL关键字
    /// </summary>
    /// <param name="_sWord">需要检查的字符串</param>
    /// <returns>存在SQL注入关键字时返回 true,否则返回 false</returns>
    public bool CheckKeyWord(string _sWord)
    {
        bool result = false;
        //模式1 : 对应Sql注入的可能关键字
        string[] patten1 = StrKeyWord.Split('|');
        //模式2 : 对应Sql注入的可能特殊符号
        string[] patten2 = StrRegex.Split('|');
        //开始检查 模式1:Sql注入的可能关键字 的注入情况
        foreach (string sqlKey in patten1)
        {
            if (_sWord.IndexOf(" " + sqlKey) >= 0 || _sWord.IndexOf(sqlKey + " ") >= 0)
            {
                //只要存在一个可能出现Sql注入的参数,则直接退出
                result = true;
                break;
            }
        }
        //开始检查 模式1:Sql注入的可能特殊符号 的注入情况
        foreach (string sqlKey in patten2)
        {
            if (_sWord.IndexOf(sqlKey) >= 0)
            {
                //只要存在一个可能出现Sql注入的参数,则直接退出
                result = true;
                break;
            }
        }
        return result;
    }
    /// <summary>
    /// 执行Sql注入验证
    /// </summary>
    public void Check()
    {
        if (CheckRequestQuery() || CheckRequestForm())
        {
            response.Write(Msg);
            response.End();
        }
    }
}

使用说明 :


代码如下:

// 使用时可以根据需要决定是要进行全局性(即针对整个应用程序)的Sql注入检查
// ,还是局部性(即在针对某个页面)的Sql注入检查

/*=========== 全局性设置:在Global.asax.cs 中加上以下代码 =============

protected void Application_BeginRequest(Object sender, EventArgs e)
{
SqlChecker SqlChecker = new SqlChecker(this.Request,this.Response);
//或 SqlChecker SqlChecker = new SqlChecker(this.Request,this.Response,safeUrl);
SqlChecker.Check();
}

/*============ 局部性:在任何时候都可直接用以下代码来实现Sql注入检验 ===============

SqlChecker SqlChecker = new SqlChecker(this.Request,this.Response);
//或 SqlChecker SqlChecker = new SqlChecker(this.Request,this.Response,safeUrl);
SqlChecker.Check();

(0)

相关推荐

  • 防止xss和sql注入:JS特殊字符过滤正则

    复制代码 代码如下: function stripscript(s) { var pattern = new RegExp("[%--`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥--&*()--|{}[]'::""'.,.?]")        //格式 RegExp("[在中间定义特殊过滤字符]")var rs = ""; for (var i = 0; i <

  • php防止SQL注入详解及防范

    一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出).这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误.对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的源程序和数据库方案),考虑以下简单的登录表单: 复制代码 代码如下: <form action="/login.php" method="POST"><p>Userna

  • 有效防止SQL注入的5种方法总结

    sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: String sql = "select id,no from user where id=" +

  • php中防止SQL注入的最佳解决方法

    如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: 复制代码 代码如下: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE"); DROP TABLE表; - ,使查询变成: 复制代码 代

  • discuz的php防止sql注入函数

    最近在做一个主题投票网站,客户懂一些程序方面的东西.有特别要求需要过滤一些字符防止sql注入.本来这方面就没有特别的研究过.呵呵,又发扬了一回拿来主义.把discuz论坛的sql防注入函数取了来! 复制代码 代码如下: $magic_quotes_gpc = get_magic_quotes_gpc(); @extract(daddslashes($_COOKIE)); @extract(daddslashes($_POST)); @extract(daddslashes($_GET)); if

  • asp 防止SQL注入代码

    把下面代码复制到每个文件头部就可以防止SQL注入了,写程序安全最重要 :) <% Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx '---定义部份 头------ Fy_Cl = 1    '处理方式:1=提示信息,2=转向页面,3=先提示再转向 Fy_Zx = "Error.Asp"  '出错时转向的页面 '---定义部份 尾------ On Error Resume Next Fy_Url=Request.ServerVaria

  • asp.net 防止SQL注入攻击

    只要做到以下三点,网站就会比较安全了而且维护也简单. 一.数据验证类 复制代码 代码如下: parameterCheck.cs public class parameterCheck{ public static bool isEmail(string emailString){ return System.Text.RegularExpressions.Regex.IsMatch(emailString, "['\\w_-]+(\\. ['\\w_-]+)*@['\\w_-]+(\\.['\\

  • PHP中防止SQL注入攻击和XSS攻击的两个简单方法

    mysql_real_escape_string() 所以得SQL语句如果有类似这样的写法:"select * from cdr where src =".$userId; 都要改成 $userId=mysql_real_escape_string($userId) 所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) .

  • PHP中防止SQL注入实现代码

    一. 注入式攻击的类型 可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型.这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话.本文后面,我们会对此作详细讨论. 如 果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如"1=1"这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示): SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1;'

  • 输入值/表单提交参数过滤有效防止sql注入的方法

    输入值/表单提交参数过滤,防止sql注入或非法攻击的方法: 复制代码 代码如下: /** * 过滤sql与php文件操作的关键字 * @param string $string * @return string * @author zyb <zyb_icanplay@163.com> */ private function filter_keyword( $string ) { $keyword = 'select|insert|update|delete|\'|\/\*|\*|\.\.\/|

随机推荐