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

 更新时间:2021年9月22日 10:16  点击:1544

复制代码 代码如下:

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();

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • ASP/PHP sql注入语句整理大全

    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
  • PHP防止SQL注入的例子

    防止SQL注入是我们程序开发人员必须要做的事情了,今天我们就来看一篇关于PHP防止SQL注入的例子了,具体的实现防过滤语句可以参考下面来看看吧。 使用prepared以及参...2016-11-25
  • PHP中自带函数过滤sql注入代码分析

    SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或...2016-11-25
  • sql安全之SQL注入漏洞拖库原理解析

    本文章以自己的一些经验来告诉你黑客朋友们会怎么利用你数据库的sql漏洞来把你的数据库下载哦,有需要的同这参考一下本文章。 在数据库中建立一张表: 代码...2016-11-25
  • ASP.NET防止SQL注入的方法示例

    这篇文章主要介绍了ASP.NET防止SQL注入的方法,结合具体实例形式分析了asp.net基于字符串过滤实现防止SQL注入的相关操作技巧,需要的朋友可以参考下...2021-09-22
  • PHP中如何防止外部恶意提交调用ajax接口

    本文简单介绍如何防止外部恶意调用ajax接口,以达到节省流量,减轻服务器压力的目的。...2016-04-15
  • php中防止post提交重复数据

    重复提交数据我们在应用中经常会碰到了,今天我给各位介绍利用session来防止用户不小心重复提交数据的一个例子 原理非常的简单:就是用session在表单页面记录下,...2016-11-25
  • PHP漏洞之SQL注入攻击简单介绍

    SQL注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的SQL查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘有一个合法的SQL查询在一起,所以说sql注...2016-11-25
  • php文件锁类防止并发的例子

    文件锁可以防止文件读写时多人访问时出现共享问题或数据不准确的问题,下面我们来看一篇关于php文件锁类防止并发的例子,具体如下. 工作间隙写了个文件锁的类,用于...2016-11-25
  • 使用checked语句防止数据溢出的解决方法

    本篇文章是对用checked语句防止数据溢出的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 如何防止入侵:My SQL各种攻击方法大全

    MYSQL用户ROOT密码为空时是一个很大的漏洞,在网上也有许多一些利用此漏洞的方法,一般就是写一个ASP或PHP的后门,不仅很麻烦,而且还要猜解网站的目录,如果对方没有开IIS,那我...2016-11-25
  • 防sql注入

    [转]SQL 注入 SQL 注入 很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令。殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和...2016-11-25
  • 在PHP中全面阻止SQL注入式攻击

     在本系列文章中,我们将全面探讨如何在PHP开发环境中全面阻止SQL注入式攻击,并给出一个具体的开发示例。  一、 引言  PHP是一种力量强大但相当容易学习...2016-11-25
  • 分享两段简单的JS代码防止SQL注入

    下面小编就为大家分享两段简单的JS代码防止SQL注入。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-04-16
  • php防止sql注入的方法详解

    小编给大家推荐的这篇文章介绍了php防止sql注入的方法,非常实用,有兴趣的同学快来看看吧。 一、什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入...2017-07-06
  • 防止SQL注入攻击的一些方法总结(1/2)

    这里小编来给大家分享一些站长总结出来的防止SQL注入攻击实例与经验,希望此教程能给各位同学提供一点帮助哦。 一、在服务器端配置 安全,PHP代码编写是一方面,PHP的...2016-11-25
  • Sqlmap+Nginx“地毯式”检测网站SQL注入漏洞教程

    Sqlmap是一个开源的SQL注入漏洞检测工具,本文我们来学习一下Sqlmap联合Nginx服务器对网站进行“地毯式”检测网站SQL注入漏洞。 以安全防御方的角度来看,防御的广...2016-11-25
  • PHP网页防范SQL注入方法配置

    前提条件是我们需要有服务器的管理权限,就是可以修改php.ini文件了,下面我来介绍修改php配置文件来防范SQL注入方法有需要学习的朋友可参考。 为了安全起见,可以打开...2016-11-25
  • php $_GET $_POST过滤sql注入程序代码

    本文章来给大家介绍一个php $_GET $_POST过滤sql注入程序代码函数,希望些函数对各位朋友有帮助,此函数只能过滤一些敏感的sql命令了,像id=1这种大家还是需要自己简单过滤...2016-11-25