代码之家  ›  专栏  ›  技术社区  ›  Sander Marechal

javascript中的简单HTML消毒剂

  •  24
  • Sander Marechal  · 技术社区  · 16 年前

    我在找用javascript编写的简单HTML消毒剂。它不需要100%XSS安全。

    我正在我的网站上实现Markdown和WMD Markdown编辑器(Github的so Master分支)。问题是实时预览中显示的HTML没有被过滤,就像这里所说的那样。我正在寻找一个简单/快速的HTML消毒剂写在javascript,以便我可以过滤预览窗口的内容。

    不需要具有完整XSS保护的完整解析器。我不会将输出发送回服务器。我将把标记发送到服务器,在将结果存储到数据库之前,在服务器上使用一个适当的完整的HTML消毒剂。

    谷歌对我来说毫无用处。我只是得到了数百篇(经常是不正确的)关于如何从各种服务器端语言的用户生成的HTML中过滤掉JavaScript的文章。

    更新

    我会更好地解释一下为什么我需要这个。我的网站有一个和StackOverflow非常相似的编辑器。有一个文本区域可以输入标记语法,它下面有一个预览窗口,向您展示提交后的效果。

    当用户提交某些内容时,它将以降价格式发送到服务器。服务器将其转换为HTML,然后在其上运行HTML消毒剂以清除HTML。标记允许任意HTML,所以我需要清理它。例如,用户键入如下内容:

    <script>alert('Boo!');</script>
    

    Markdown转换器不接触它,因为它是HTML。HTML消毒剂会将其剥离,这样脚本元素就消失了。

    但这并不是在预览窗口中发生的。预览窗口只将标记转换为HTML,但不清除标记。所以,预览窗口将有一个脚本元素,这意味着预览窗口不同于服务器上的实际渲染。

    我想解决这个问题,所以我需要一个快速和肮脏的javascriptHTML消毒剂。简单的基本元素/属性黑名单和白名单就可以了。它不需要是XSS安全的,因为XSS保护是由服务器端的HTML消毒剂完成的。

    这只是为了确保预览窗口将匹配99.99%的实际渲染时间,这对我来说已经足够好了。

    你能帮忙吗?事先谢谢!

    3 回复  |  直到 7 年前
        1
  •  12
  •   Community Mohan Dere    9 年前

    你应该看看这个问题中推荐的那个 Sanitize/Rewrite HTML on the Client Side

    为了确保您不需要对XSS做更多的工作,请查看这个问题的答案。 How to prevent Javascript injection attacks within user-generated HTML

        2
  •  1
  •   Alex from Jitbit    7 年前

    我们开发了一个简单的htmlsantizer,并在这里对其进行了开源: https://github.com/jitbit/HtmlSanitizer

    用法

    var result = HtmlSanitizer.SanitizeHtml(input);
    

    [免责声明]!我是作者之一!]

        3
  •  -2
  •   plainOldNerd    8 年前

    对于我的函数,我只关心字符串不是空的,并且只包含字母数字字符。它使用普通的JS,没有第三个库或任何其他库。它包含一个很长的regex,但它完成了任务;) 您可以在此基础上构建regex,但要使regex更类似于“<script></script>”(必要时使用转义字符,并减去空格)。;)

        var validateString = function(string) {
    
          var validity = true;
    
          if( string == '' ) { validity = false; }
    
          if( string.match( /[ |<|,|>|\.|\?|\/|:|;|"|'|{|\[|}|\]|\||\\|~|`|!|@|#|\$|%|\^|&|\*|\(|\)|_|\-|\+|=]+/ ) != null ) {
    
              validity = false;
          }
    
          return validity;
        }