一:丢弃SQL语句直接拼接,虽然这个写起来很快很方便。
二:如果用SQL语句,那就使用参数化,添加Param
三:尽可能的使用存储过程,安全性能高而且处理速度也快
四:屏蔽SQL,javascript等注入(很是主要的),对于每个文件写是不太可能的。所以要找到对所有文件起作用的办法。我在网上收集了以下3种方法
在Web.config文件中, < appSettings>下面增加一个标签:如下
- <
其中key是 < saveParameters>后面的值为"OrderId-int32"等,其中"-"前面表示参数的名称比如:OrderId,后面的int32表示数据类型。
在Global.asax中增加下面一段:
- protected
void Application_BeginRequest(Object sender, EventArgs e){ - String[] safeParameters = System.Configuration.ConfigurationSettings.AppSettings["safeParameters"
].ToString().Split(',' ); - for
(int i= 0 ;i < safeParameters.Length; i++){ - String parameterName = safeParameters
.Split('-' )[0]; - String parameterType = safeParameters
.Split('-' )[1]; - isValidParameter(parameterName, parameterType);
- }
- }
- public
void isValidParameter(string parameterName, string parameterType){ - string
parameterValue = Request.QueryString[parameterName]; - if
(parameterValue == null ) return ; - if
(parameterType.Equals("int32" )){ - if
(!parameterCheck.isInt(parameterValue)) Response.Redirect("parameterError.aspx" ); - }
- else
if (parameterType.Equals("USzip" )){ - if
(!parameterCheck.isUSZip(parameterValue)) Response.Redirect("parameterError.aspx" ); - }
- else
if (parameterType.Equals("email" )){ - if
(!parameterCheck.isEmail(parameterValue)) Response.Redirect("parameterError.aspx" ); - }
- }
使用字符串过滤类
- using
System; - namespace
web.comm - {
- /**/
/// < summary> - /// ProcessRequest 的摘要说明。
- /// < /summary>
- public
class ProcessRequest - {
- public
ProcessRequest() - {
- //
- // TODO: 在此处添加构造函数逻辑
- //
- }
- SQL注入式攻击代码分析#region SQL注入式攻击代码分析
- /**/
/// < summary> - /// 处理用户提交的请求
- /// < /summary>
- public
static void StartProcessRequest() - {
- // System.Web.HttpContext.Current.Response.Write("< script>alert('dddd');< /script>");
- try
- {
- string
getkeys = "" ; - //string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["CustomErrorPage"].ToString();
- if
(System.Web.HttpContext.Current.Request.QueryString != null ) - {
- for
(int i=0;i< System.Web.HttpContext.Current.Request.QueryString.Count;i++) - {
- getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys
; - if
(!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys],0)) - {
- //System.Web.HttpContext.Current.Response.Redirect (sqlErrorPage+"?errmsg=sqlserver&sqlprocess=true");
- System.Web.HttpContext.Current.Response.Write("< script>alert('请勿非法提交!');history.back();< /script>"
); - System.Web.HttpContext.Current.Response.End();
- }
- }
- }
- if
(System.Web.HttpContext.Current.Request.Form != null ) - {
- for
(int i=0;i< System.Web.HttpContext.Current.Request.Form.Count;i++) - {
- getkeys = System.Web.HttpContext.Current.Request.Form.Keys
; - if
(!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys],1)) - {
- //System.Web.HttpContext.Current.Response.Redirect (sqlErrorPage+"?errmsg=sqlserver&sqlprocess=true");
- System.Web.HttpContext.Current.Response.Write("< script>alert('请勿非法提交!');history.back();< /script>"
); - System.Web.HttpContext.Current.Response.End();
- }
- }
- }
- }
- catch
- {
- // 错误处理: 处理用户提交信息!
- }
- }
- /**/
/// < summary> - /// 分析用户请求是否正常
- /// < /summary>
- /// < param name="Str">传入用户提交数据< /param>
- /// < returns>返回是否含有SQL注入式攻击代码< /returns>
- private
static bool ProcessSqlStr(string Str,int type) - {
- string
SqlStr; - if
(type == 1) - SqlStr = "exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare "
; - else
- SqlStr = "'|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare"
; - bool
ReturnValue = true ; - try
- {
- if
(Str != "" ) - {
- string
[] anySqlStr = SqlStr.Split('|' ); - foreach
(string ss in anySqlStr) - {
- if
(Str.IndexOf(ss)>=0) - {
- ReturnValue = false
; - }
- }
- }
- }
- catch
- {
- ReturnValue = false
; - }
- return
ReturnValue; - }
- #endregion
- }
- }