【问题标题】:Regular expressions to prevent XSS or something else?防止 XSS 或其他东西的正则表达式?
【发布时间】:2013-03-22 19:25:36
【问题描述】:

我正在尝试保护我的网站免受跨站脚本 (XSS) 的攻击,并且我正在考虑使用正则表达式来验证用户输入。

这是我的问题:我有一个危险的 HTML 标签列表...

<applet>
<body>
<embed>
<frame>
<script>
<frameset>
<html>
<iframe>
<img>
<style>
<layer>
<link>
<ilayer>
<meta>
<object>

...我想将它们包含在正则表达式中 - 这可能吗?如果没有,我应该使用什么?你有什么想法如何实现这样的东西吗?

【问题讨论】:

  • 为什么这些输入很危险?字符串并不危险,你用它做的事情可能很危险。那么你如何处理输入?
  • &lt;style TYPE="text/javascript"&gt; alert('hello'); &lt;/style&gt;
  • 只需将&amp;lt; 替换为&amp;lt;,标签就会失去他的权力
  • 如果userInput 是字符串,您可以尝试类似userInput = userInput.replace("&lt;","&amp;lt;");

标签: c# asp.net regex security xss


【解决方案1】:
    public static bool ValidateAntiXSS(string inputParameter)
    {
        if (string.IsNullOrEmpty(inputParameter))
            return true;

        // Following regex convers all the js events and html tags mentioned in followng links.
        //https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet                 
        //https://msdn.microsoft.com/en-us/library/ff649310.aspx

        var pattren = new StringBuilder();

        //Checks any js events i.e. onKeyUp(), onBlur(), alerts and custom js functions etc.             
        pattren.Append(@"((alert|on\w+|function\s+\w+)\s*\(\s*(['+\d\w](,?\s*['+\d\w]*)*)*\s*\))");

        //Checks any html tags i.e. <script, <embed, <object etc.
        pattren.Append(@"|(<(script|iframe|embed|frame|frameset|object|img|applet|body|html|style|layer|link|ilayer|meta|bgsound))");

        return !Regex.IsMatch(System.Web.HttpUtility.UrlDecode(inputParameter), pattren.ToString(), RegexOptions.IgnoreCase | RegexOptions.Compiled);
    }

【讨论】:

  • 支持至少尝试做 OP 要求的事情!不知道它是否有效...... ;)
【解决方案2】:

请阅读OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet 以获取广泛的信息。黑名单标签不是一种非常有效的方法,并且会留下空白。您应该过滤输入、在输出到浏览器之前进行清理、编码 HTML 实体以及我的链接中讨论的各种其他技术。

【讨论】:

  • 我使用 Ajax 过滤,它不允许 &lt;&gt;~!@#$%^&*()'` 但我想确定我没有错过任何东西
  • 您应该过滤/清理/验证数据客户端和服务器端,特别是如果您要处理进入数据库的信息。存储的 XSS(持久性)可能是一件非常非常糟糕的事情。即使您阻止“坏字符”填写表单字段,我仍然可以直接发布到您的表单进行处理。两端处理!
  • 这意味着我必须在插入服务器端之前进行验证。谢谢!
  • @AndreyIvanov meh 这根本不是关于验证或清理,而是关于逃避。转义意味着您将保留所提供的完全相同的信息。如果我在这里发布&amp;lt;script&amp;gt;,我会看到&amp;lt;script&amp;gt; - 它没有被删除,我没有看到有关不良数据的错误,当然我也看不到&amp;lt;script&amp;gt;,但正是我发布的内容。这也是最简单的。
  • 这是我回答中的 HTML 实体部分。此外,这并不能防止所有 XSS 攻击。如果您没有对答案做出任何新的或更好的贡献,请不要对答案发表评论。
【解决方案3】:

您应该将字符串编码为 HTML。使用dotNET方法

HttpUtils.HtmlEncode(string text)

还有更多详情http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

【讨论】:

  • +1 这就是一个人的需要,不必比这更复杂。但问题当然与不使用参数化查询时相同——一些开发人员真的很擅长忘记逃避。因此,使用带有自动转义的 razor 之类的模板语言要好得多。
  • 我在我的项目中只使用了程序,但仍然希望获得跨站点脚本的保护
  • 您将受到保护!编码后,您的标签将被视为常规数据
【解决方案4】:

正如已经讨论过的,将黑名单作为清理措施无效。想想当有人提交精心制作的输入时,您的黑名单会发生什么:

&lt;SCRIPT&gt;
&lt;ScRiPt&gt;
&lt; S C R I P T &gt;
&lt;scr&amp;#00ipt&gt;
&lt;scr&lt;script&gt;ipt&gt;(你是否递归应用了黑名单;-))

这不是对可能的攻击的列举,而只是一些关于如何击败黑名单的例子。这些都会在浏览器中正确呈现。

【讨论】:

  • 我之前一直在问如何做这个黑白名单但没有得到任何答案,你能分享一些可以指导如何做的链接吗?
  • 我不知道任何在线教程,但Web Application Hacker's Handbook 是一个很好的网络应用安全资源。它将教您有关该主题的所有知识,并且阅读起来很有趣。
  • 太棒了!我没有它,但如果我记得前 3 章中有一个很好的部分,然后在第 12-15 章或类似的地方有另一个很好的部分。抱歉,缺乏特异性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多