侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

.Net防sql注入的几种方法

数据库  /  管理员 发布于 5年前   320

防sql注入的常用方法:

1、服务端对前端传过来的参数值进行类型验证;

2、服务端执行sql,使用参数化传值,而不要使用sql字符串拼接;

3、服务端对前端传过来的数据进行sql关键词过来与检测;

着重记录下服务端进行sql关键词检测:

1、sql关键词检测类:

public class SqlInjectHelper:System.Web.UI.Page {  private static 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 static string StrSymbol = ";|(|)|[|]|{|}|%|@|*|'|!";  private HttpRequest request;  public SqlInjectHelper(System.Web.HttpRequest _request)  {   this.request = _request;  }  public bool CheckSqlInject()  {   return CheckRequestQuery() || CheckRequestForm();  }  ///<summary>   ///检查URL中是否包含Sql注入   /// <param name="_request">当前HttpRequest对象</param>   /// <returns>如果包含sql注入关键字,返回: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>如果包含sql注入关键字,返回: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;  }  ///<summary>   ///检查字符串中是否包含Sql注入关键字   /// <param name="_key">被检查的字符串</param>   /// <returns>如果包含sql注入关键字,返回:true;否则返回:false</returns>   ///</summary>   private static bool CheckKeyWord(string _key)  {   string[] pattenKeyWord = StrKeyWord.Split('|');   string[] pattenSymbol = StrSymbol.Split('|');   foreach (string sqlParam in pattenKeyWord)   {    if (_key.Contains(sqlParam + " ") || _key.Contains(" " + sqlParam))    {     return true;    }   }   foreach (string sqlParam in pattenSymbol)   {    if (_key.Contains(sqlParam))    {     return true;    }   }   return false;  } }

SqlInjectHelper类中,对request的query参数和form参数进行的检测,没有对cookie的检测,如有需要,可自行加上;

2、SqlInjectHelper在哪调用呢?

1)、如果想对整个web站点的所有请求都做sql关键字检测,那就在Global.asax 的 Application_BeginRequest方法中调用;

protected void Application_BeginRequest(object sender, EventArgs e)  {   SqlInjectHelper myCheck = new SqlInjectHelper(Request);   bool result = myCheck.CheckSqlInject();   if (result)   {    Response.ContentType = "text/plain";    Response.Write("您提交的数据有恶意字符!");    Response.End();   }  }

2)、如果只需对某个接口文件的接口进行sql关键字检测,那只需在该文件开始处调用SqlInjectHelper类即可;

public class Handler1 : IHttpHandler {  public void ProcessRequest(HttpContext context)  {   SqlInjectHelper myCheck = new SqlInjectHelper(context.Request);   bool result = myCheck.CheckSqlInject();   context.Response.ContentType = "text/plain";   context.Response.Write(result?"您提交的数据有恶意字符!":"");   context.Response.StatusCode = result ? 500 : 200;  }  public bool IsReusable  {   get   {    return false;   }  } }

上面的代码就是对某个一般处理程序(ashx)添加了sql关键字检测;

3、补充说明:asp.net中的 __VIEWSTATE、__EVENTVALIDATION、

  在sql关键字检测方法中,排除了__VIEWSTATE、__EVENTVALIDATION这两个参数;

1)、__VIEWSTATE

  ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。

ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。

  当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值;

2)、__EVENTVALIDATION

  __EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。

“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.;

4、sql关键词检测的另一个版本:该版本将所有危险字符都放在了一个正则表达式中;

该类不仅检测了sql常用关键字还有xss攻击的常用关键字

public class SafeHelper {  private const string StrRegex = @"<[^>]+?style=[\w]+?:expression\(|\b(alert|confirm|prompt)\b|^\+/v(8|9)|<[^>]*?=[^>]*?&#[^>]*?>|\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|/\*.+?\*/|<\s*script\b|<\s*img\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";  public static bool PostData()  {   bool result = false;   for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)   {    result = CheckData(HttpContext.Current.Request.Form[i].ToString());    if (result)    {     break;    }   }   return result;  }  public static bool GetData()  {   bool result = false;   for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)   {    result = CheckData(HttpContext.Current.Request.QueryString[i].ToString());    if (result)    {     break;    }   }   return result;  }  public static bool CookieData()  {   bool result = false;   for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++)   {    result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower());    if (result)    {     break;    }   }   return result;  }  public static bool referer()  {   bool result = false;   return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString());  }  public static bool CheckData(string inputData)  {   if (Regex.IsMatch(inputData, StrRegex))   {    return true;   }   else   {    return false;   }  } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对AIDI的支持。


  • 上一条:
    sqlyog 中文乱码问题的设置方法
    下一条:
    sql关键词脚本检查正则表达式的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客