#防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 > )
{
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 > )
{
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 ? : ;
}
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 = ; 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 = ; 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 = ; 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;
}
}
}

————————————————————————————————————

.Net防sql注入的方法总结的更多相关文章

  1. C#语言Winform防SQl注入做用户登录的例子

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. Sqlparameter防SQL注入

    一.SQL注入的原因 随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对 ...

  3. mysql之数据库连接的方法封装及防sql注入

    一.定义数据库和表 create database animal; CREATE TABLE `pet` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name ...

  4. C#防SQL注入代码的实现方法

    对于网站的安全性,是每个网站开发者和运营者最关心的问题.网站一旦出现漏洞,那势必将造成很大的损失.为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位. 下面说下网站防注入的几点 ...

  5. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  6. PHP防SQL注入不要再用addslashes和mysql_real_escape_string

    PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...

  7. 防SQL注入:生成参数化的通用分页查询语句

    原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...

  8. Python中防止sql注入的方法详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...

  9. 【转载】C#防SQL注入过滤危险字符信息

    不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...

随机推荐

  1. 【POJ 2777】 Count Color

    [题目链接] http://poj.org/problem?id=2777 [算法] 线段树 [代码] #include <algorithm> #include <bitset&g ...

  2. hibernate中id中的 precision 和 scale 作用

    转自:https://www.cnblogs.com/IT-Monkey/p/4077570.html <hibernate-mapping>     <class name=&qu ...

  3. unittest举例

    步骤:1.先导入unittest2.编写一个测试类(继承unittest.TestCase)3.编写测试用例类,一个方法就是一条用例4.加载测试用例,有三种方式:加载测试方法,加载测试类,加载测试模块 ...

  4. Java统计一个字符串中各个字符出现的次数

    相信很多人在工作的时候都会遇到这样一个,如何统计一个字符串中各个字符出现的次数呢,这种需求一把用在数据分析方面,比如根据特定的条件去查找某个字符出现的次数.那么如何实现呢,其实也很简单,下面我贴上代码 ...

  5. JavaScript--编程挑战

    小伙伴们,请编写"改变颜色"."改变宽高"."隐藏内容"."显示内容"."取消设置"的函数,点击相应 ...

  6. ASP.NET MVC5 之 AspNetUsers 表增加字段

    MVC5 执行数据库迁移时,会生成一些默认的数据表,但是在实际的工作中.若用到的时候,难免要增添一些字段. 1.AspNetUsers 增加字段 A.打开MVC中的 IdentityModels.cs ...

  7. BZOJ 2178 Simpson积分

    思路: 我发现能用Simpson积分水的题  好像都是裸题诶233333 //By SiriusRen #include <bits/stdc++.h> using namespace s ...

  8. .Net application,Session,Cache简单比较

    Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象.不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对 ...

  9. [转]Android监听ListView里Button事件

    本文转自:http://blog.csdn.net/lovediji/article/details/6753349 public View getView(int position, View co ...

  10. linux对比两个文件的差异

    在项目维护阶段,经常会对垃圾文件进行清理.比如没有在数据库中的文件进行删除,这个时候最好的选择就是使用shell命令了:废话不多说直接上代码: 1.首先准备好从数据表导出来的数据,方法随意 2.在服务 ...