【问题标题】:Regex to match <%= server tag in a text to protect from injection正则表达式匹配文本中的 <%= 服务器标记以防止注入
【发布时间】:2014-07-04 21:09:28
【问题描述】:
  Regex r = new Regex("([sS][cC][rR][iI][pP][tT])|([sS][qQ][lL])|(<%=)");

未找到任何

我做错了什么?

  [\<]  gives escape unrecognized error. Just as [\%] do.

示例字符串:

   Injection protection test:
   <script> alert('fail'); 
   </script> 
   <asp:SqlDataSource runat="server"></asp:SqlDataSource>
   <%= Server.Rewrite( ....) %>

【问题讨论】:

  • 我可以建议使用不区分大小写的正则表达式吗?
  • @elgonzo 虽然正确,但没有一个有问题的字符需要转义 afaik。
  • 它会搜索&lt;%= 以及您的正则表达式模式。测试一下here
  • 有一些执行脚本攻击的方法不涉及单个完整的单词SCRIPT(在任何情况下都区分大小写)。 IMO,您完全是从错误的角度来解决这个问题的。您应该在输出时转义数据。试图过滤输入只是一场军备竞赛。
  • 现在,如果只有 asp.net 内置了输出转义......例如如果只有 &lt;%:expression %&gt; 存在......

标签: c# regex .net-4.5 code-behind


【解决方案1】:

我做错了什么?

从错误的角度解决问题。你不能希望过滤每一个输入:这只是两个竞争派系之间的竞赛,坦率地说,XSS 团队有一个巨大的领先优势,拥有你永远不会认为的所有有趣的事情列表阻止,他们只需要赢得一次就可以算成功;您需要每次都赢才能算成功。

这里的正确方法是在输出时转义数据。在网络视图中,这很简单:

<%: expression %>

(而不是&lt;%= expression %&gt;,未转义)

razor 中,转义是默认设置,@expression 将自动转义,除非表达式将自己声明为 IHtmlString

同样,您的过滤器提到了 SQL;对于 SQL,适当的方法是使用参数。不要尝试清理值以修复 SQL 注入(但一定要检查它们是否满足您的业务要求)。

【讨论】:

  • 我正在使用 htmleditorextender 并且当我使用 Server.HtmlEncode(output) 时输出被打乱(作为 ),所有样式都消失了。
【解决方案2】:

如果你使用 c# (.net) 你可以使用

string input = @"Injection protection test:
<script> alert('fail'); 
</script> 
<asp:SqlDataSource runat="server"></asp:SqlDataSource>
<%= Server.Rewrite( ....) %>"

string[] shouldNotContain=
{
    "sql",
    "<%=",
    "script"
};

if(shouldNotContain.Any(input.Contains)
{
   //The imput contains one or more of the keywords above
}
else
{
    //The string is fine
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多