問題背景:由于公司需要整改的老系統(tǒng)的漏洞檢查,而系統(tǒng)就是沒有使用參數(shù)化SQL即拼接查詢語句開發(fā)的程序,導(dǎo)致漏洞掃描出現(xiàn)大量SQL注入問題。
解決方法:最好的辦法就是不寫拼接SQL,改用參數(shù)化SQL,推薦新項(xiàng)目使用,老項(xiàng)目改起來比較麻煩,花費(fèi)的時(shí)間也多,最后選擇用全局SQL過濾器過濾前端發(fā)送的請(qǐng)求內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-801605.html
代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-801605.html
/// <summary>
/// 防止輸入?yún)?shù)sql注入:Post Get Cookies
/// </summary>
public class SqlFilter : ActionFilterAttribute
{
private const string FilterSql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--";
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// -----------------------防 Post 注入-----------------------
if (filterContext.HttpContext.Request.Form != null)
{
var isReadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 Form 屬性改為可讀寫
isReadonly?.SetValue(filterContext.HttpContext.Request.Form, false, null);
for (var k = 0; k < filterContext.HttpContext.Request.Form.Count; k++)
{
var inputKey = filterContext.HttpContext.Request.Form.Keys[k];
var inputValue = filterContext.HttpContext.Request.Form[inputKey];
var filters = FilterSql.Split(',');
inputValue = filters.Aggregate(inputValue, (current, filterSql) => Regex.Replace(current, filterSql, "", RegexOptions.IgnoreCase));
filterContext.HttpContext.Request.Form[inputKey] = inputValue;
}
}
// -----------------------防 GET 注入-----------------------
if (filterContext.HttpContext.Request.QueryString != null)
{
var isReadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 QueryString 屬性改為可讀寫
isReadonly?.SetValue(filterContext.HttpContext.Request.QueryString, false, null);
for (var k = 0; k < filterContext.HttpContext.Request.QueryString.Count; k++)
{
var inputKey = filterContext.HttpContext.Request.QueryString.Keys[k];
var inputValue = filterContext.HttpContext.Request.QueryString[inputKey];
var filters = FilterSql.Split(',');
inputValue = filters.Aggregate(inputValue, (current, filterSql) => Regex.Replace(current, filterSql, "", RegexOptions.IgnoreCase));
filterContext.HttpContext.Request.QueryString[inputKey] = inputValue;
}
}
// -----------------------防 Cookies 注入-----------------------
if (filterContext.HttpContext.Request.Cookies.Count > 0)
{
var isReadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 Cookies 屬性改為可讀寫
isReadonly?.SetValue(filterContext.HttpContext.Request.Cookies, false, null);
for (var k = 0; k < filterContext.HttpContext.Request.Cookies.Count; k++)
{
var inputKey = filterContext.HttpContext.Request.Cookies.Keys[k];
var inputValue = filterContext.HttpContext.Request.Cookies[inputKey]?.Value;
var filters = FilterSql.Split(',');
inputValue = filters.Aggregate(inputValue, (current, filterSql) => Regex.Replace(current, filterSql, "", RegexOptions.IgnoreCase));
if (!(filterContext.HttpContext.Request.Cookies[inputKey] is null))
{
filterContext.HttpContext.Request.Cookies[inputKey].Value = inputValue;
}
}
}
base.OnActionExecuting(filterContext);
}
}
到了這里,關(guān)于.Net 全局過濾,防止SQL注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!