正则表达式匹配文本中的<%=服务器标签以防止注入

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)

Mar*_*ell 7

我究竟做错了什么?

从错误的角度解决问题.你不能希望过滤每一个输入:这只是两个竞争派系之间的竞争,坦率地说,XSS团队有一个巨大的开端,拥有你永远不会想到阻止的整个有趣的事物列表,他们只需要赢得一次,算作成功; 你需要每次都赢得成功.

这里正确的方法是在输出处转义数据.在Web视图中,这很简单:

<%: expression %>
Run Code Online (Sandbox Code Playgroud)

(而不是<%= expression %>,未转义)

剃刀中,转义是默认值,并且@expression将自动转义,除非表达式声明自己为IHtmlString.

同样,您的过滤器提到SQL; 当涉及到SQL时,适当的方法是使用参数.不要尝试清理值作为SQL注入的修复(但一定要检查它们是否满足您的业务需求).