代码之家  ›  专栏  ›  技术社区  ›  Joel Coehoorn

仅限HTMLEncode脚本标记

  •  2
  • Joel Coehoorn  · 技术社区  · 15 年前

    我正在工作 StackQL.net

    我所做的选择之一就是这样做

    <script> 标记处于活动状态。有人可能在stackoverflow答案中植入恶意脚本;他们甚至可以立即删除它,所以没有人看到它。人们第一次访问时最常见的查询之一是一个简单的问题 Select * from posts ,因此,只要稍加计时,这样的脚本就可以在多个用户的浏览器中运行。我想在更新(希望很快发布)10月数据导出之前,确保这不是一个问题。

    最好的,最安全的 如何确保只对脚本标记进行编码?

    6 回复  |  直到 15 年前
        1
  •  3
  •   George Stocker NotMe    15 年前

    您可能需要修改 HTMLSanatize script

        2
  •  2
  •   Community Radu Dragan    7 年前

    别忘了 onclick onmouseover <img src="javascript:evil!Evil!"> )或CSS( style="property: expression(evil!Evil!);" )或

    除了简单的脚本元素之外,还有许多攻击向量。

    实施 white list ,而不是黑名单。

        3
  •  1
  •   Joanne C    15 年前

    如果消息是XHTML格式的,那么您可以进行XSL转换,并对不需要的标记和属性进行编码/剥离。如果您使用TinyMCE或CKEditor之类的工具来提供输出XHTML的所见即所得编辑器,那么就容易多了。

        4
  •  0
  •   Esteban Küber    15 年前

    简单地打破僵局怎么样 <script> < > &lt;script&gt;

    href='javascript:' ,以及以 on *.

    为了确定,从轨道上用核武器把它炸了。

        5
  •  0
  •   Joel Coehoorn    15 年前

    但我担心这也会离开 <script

    哦,这只是HTML恶意内容的开始,可能会导致跨站点脚本。还有事件处理程序;内嵌、嵌入和链接CSS(表达式、行为、绑定)、Flash和其他可嵌入插件、iFrame以利用站点, javascript: 还有其他危险的计划(比你想象的还要多!)在每个可以接受URL、元刷新、UTF-8超长、UTF-7错误嗅探、数据绑定、VML和其他非HTML内容的地方,被允许的浏览器解析为脚本的破损标记。。。

    简言之,任何用简单正则表达式净化HTML的快速修复尝试都将严重失败。

    但是,您不是使用与SO本身相同的降价系统来渲染帖子吗?这是显而易见的事情。我不能保证在降价中没有允许跨站点脚本编写的漏洞(过去确实存在,而且可能还有一些更模糊的漏洞,因为这是一个相当复杂的系统)。但至少你不会比现在更不安全!

        6
  •  -1
  •   Senura Dissanayake    6 年前

    使用 正则表达式 用编码的标记替换脚本标记。这将过滤包含单词“script”的标签,并 HtmlEncode <script> , </script> <script type="text/javascript"> etc将被编码,而不会对字符串中的其他标记进行编码。

    Regex.Replace(text, @"</?(\w+)[^>]*>",
                tag => tag.Groups[1].Value.ToLower().Contains("script") ? HttpUtility.HtmlEncode(tag.Value) : tag.Value,
                RegexOptions.Singleline);