SQL注入、XSS的跨站入侵,已是老的话题,但很多时候前端开发人员一不留神则会忽略了此类安全的过滤。以下通过简单的代码示例展示这两种入侵的全局屏蔽,当然如果你需求对URL中特殊页面传输敏感字符,则可增加页面配置规则,放行即可。
考虑到非法请求有两种:GET方式:Encode之前、Encode之后的URL串,POST方式:表单提交;所有欲全局控制,则可在APP请求生命周期的最前端完成拦截(.NET:httpmodule、httphandler)。对GET请求,Encode前后分别做校验,对form方式数据,则需要全局遍历Form数据,本示例仅给出GET方式的Request请求处理。
示例:
string regexsString = @"\'|;|#|--|<|>|\*|\+|\(|\)|chr(34)|chr(0)|([\s\b+()]+(select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b+]*)";
string url = HttpContext.Current.Request.RawUrl.ToString();
bool IsValid = true;
Regex regex = new Regex(regexsString, RegexOptions.IgnoreCase);
string decodeUrl = HttpUtility.UrlDecode(url);
if (regex.IsMatch(url) || regex.IsMatch(decodeUrl))
{
IsValid = false;
}
if (!IsValid)
{
LogHelper.Security("Security:", "非法的SQL注入" + " Ip:" + GlobalItem.GetRequestIP + ", Url:" + url);
HttpContext.Current.Response.Redirect("ErrorPage.aspx?code=" + ErrorDefine.INVALID_SQL_INJECT);
}
regexsString 用以配置过滤敏感字符的规则。