Tuğ*_*rul -2 c# regex code-behind .net-4.5
Regex r = new Regex("([sS][cC][rR][iI][pP][tT])|([sS][qQ][lL])|(<%=)");
Run Code Online (Sandbox Code Playgroud)
没有找到任何<%=出现但正确找到SqL,SQL,sQL,脚本,ScRipT ......
我究竟做错了什么?
[\<] gives escape unrecognized error. Just as [\%] do.
Run Code Online (Sandbox Code Playgroud)
示例字符串:
Injection protection test:
<script> alert('fail');
</script>
<asp:SqlDataSource runat="server"></asp:SqlDataSource>
<%= Server.Rewrite( ....) %>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
从错误的角度解决问题.你不能希望过滤每一个输入:这只是两个竞争派系之间的竞争,坦率地说,XSS团队有一个巨大的开端,拥有你永远不会想到阻止的整个有趣的事物列表,他们只需要赢得一次,算作成功; 你需要每次都赢得成功.
这里正确的方法是在输出处转义数据.在Web视图中,这很简单:
<%: expression %>
Run Code Online (Sandbox Code Playgroud)
(而不是<%= expression %>,未转义)
在剃刀中,转义是默认值,并且@expression将自动转义,除非表达式声明自己为IHtmlString.
同样,您的过滤器提到SQL; 当涉及到SQL时,适当的方法是使用参数.不要尝试清理值作为SQL注入的修复(但一定要检查它们是否满足您的业务需求).