.Net防sql注入的方法总结
#防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注入的方法总结的更多相关文章
- C#语言Winform防SQl注入做用户登录的例子
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Sqlparameter防SQL注入
一.SQL注入的原因 随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对 ...
- mysql之数据库连接的方法封装及防sql注入
一.定义数据库和表 create database animal; CREATE TABLE `pet` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name ...
- C#防SQL注入代码的实现方法
对于网站的安全性,是每个网站开发者和运营者最关心的问题.网站一旦出现漏洞,那势必将造成很大的损失.为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位. 下面说下网站防注入的几点 ...
- 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项
我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...
- PHP防SQL注入不要再用addslashes和mysql_real_escape_string
PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...
- 防SQL注入:生成参数化的通用分页查询语句
原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...
- Python中防止sql注入的方法详解
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...
- 【转载】C#防SQL注入过滤危险字符信息
不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...
随机推荐
- [NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL
题外话: 中国的技术论坛要赶上stackoverflow的水平.至少还需35年.中国程序猿笔者的特点是:太浮躁,太easy下总结.太自得其乐,虽说写的是为了让别人更好的看.却也演变成了一种" ...
- Uva 10036 - Divisibility
Consider an arbitrary sequence of integers. One can place + or - operators between integers in the s ...
- Codeforces Round #211 (Div. 2)B. Fence
B. Fence time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- P4111 [HEOI2015]小Z的房间 生成树计数
这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...
- hibernate中id中的 precision 和 scale 作用
转自:https://www.cnblogs.com/IT-Monkey/p/4077570.html <hibernate-mapping> <class name=&qu ...
- Android webkit keyevent 事件传递过程
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- thinkphp vender
vender在thinkphp里面时引入系统的类库的意思,具体用法如下. Vendor('Classes.PHPExcel');表示引入vendor目录下的classes文件夹下面的phpexcel文 ...
- Java经典算法之插入排序(Insert Sort)
插入排序在局部有序的情况下比冒泡排序快一倍,比选择排序快一点. 那什么是插入排序,就是将局部有序的数据向右移动,将未排序的数据插到他的前面 下面我们来解析代码: 这里外层循环out变量从1开始向右移动 ...
- QT 制作串口调试小助手----(小白篇)
一.成品图展示 简介:因zigbee实验,制作一个相对简易版的上位机,接收来自zigbee无线传感采集的温湿度.光照等数据. 并且将数据部分描绘成实时动态折线统计图. 二.主要功能介绍 主要使用QT自 ...
- linux 如何查看进程的执行时间
ps -ef|grep wo.php 得到 程序的pid 如 123 ps -p 123 -o etime