代码之家  ›  专栏  ›  技术社区  ›  Doug T.

在生成的数据中检查和不打印javascript?

  •  2
  • Doug T.  · 技术社区  · 16 年前

    在我的php web应用程序中,假设我想做更多的工作,除了去帮派杀手和保持对输入的清理能力之外,我还想确保在插入html模板的字符串中没有输出javascript。

    有没有一种标准的方法来确保我不会在生成的html内容中添加javascript?

    4 回复  |  直到 12 年前
        1
  •  2
  •   leek Bharat Chodvadiya    16 年前

    如果您不反对外部依赖项,则 HTML Purifier library 对于大多数xss攻击来说是一个很好的过滤器。

        2
  •  0
  •   dlamblin    16 年前

    不完全是一种标准的方式;因为如果你正在做: <img src="${path}"> ${path} 扩展到 http://p0wned.com/jpg.jpg" /><script src="p0wned.com/js.js"/>

    不管怎样,我喜欢这个正则表达式:

    #from http://www.perlmonks.org/?node_id=161281
    sub untag {
      local $_ = $_[0] || $_;
    # ALGORITHM:
    #   find < ,
    #       comment <!-- ... -->,
    #       or comment <? ... ?> ,
    #       or one of the start tags which require correspond
    #           end tag plus all to end tag
    #       or if \s or ="
    #           then skip to next "
    #           else [^>]
    #   >
      s{
        <               # open tag
        (?:             # open group (A)
          (!--) |       #   comment (1) or
          (\?) |        #   another comment (2) or
          (?i:          #   open group (B) for /i
            ( TITLE  |  #     one of start tags
              SCRIPT |  #     for which
              APPLET |  #     must be skipped
              OBJECT |  #     all content
              STYLE     #     to correspond
            )           #     end tag (3)
          ) |           #   close group (B), or
          ([!/A-Za-z])  #   one of these chars, remember in (4)
        )               # close group (A)
        (?(4)           # if previous case is (4)
          (?:           #   open group (C)
            (?!         #     and next is not : (D)
              [\s=]     #       \s or "="
              ["`']     #       with open quotes
            )           #     close (D)
            [^>] |      #     and not close tag or
            [\s=]       #     \s or "=" with
            `[^`]*` |   #     something in quotes ` or
            [\s=]       #     \s or "=" with
            '[^']*' |   #     something in quotes ' or
            [\s=]       #     \s or "=" with
            "[^"]*"     #     something in quotes "
          )*            #   repeat (C) 0 or more times
        |               # else (if previous case is not (4))
          .*?           #   minimum of any chars
        )               # end if previous char is (4)
        (?(1)           # if comment (1)
          (?<=--)       #   wait for "--"
        )               # end if comment (1)
        (?(2)           # if another comment (2)
          (?<=\?)       #   wait for "?"
        )               # end if another comment (2)
        (?(3)           # if one of tags-containers (3)
          </            #   wait for end
          (?i:\3)       #   of this tag
          (?:\s[^>]*)?  #   skip junk to ">"
        )               # end if (3)
        >               # tag closed
       }{}gsx;          # STRIP THIS TAG
      return $_ ? $_ : "";
    }
    
        3
  •  0
  •   Kent Brewster    16 年前

    在php中,我将从strip_标记开始。像这样:

    $output = strip_tags($input);
    

    如果我想在用户输入中允许一些标记,我会将它们包括在内,如下所示:

    $output = strip_tags($input, '<code><em><strong>');
    
        4
  •  0
  •   tduehr    16 年前

    我认为不可能找到这样的javascript代码。

    您必须通过某种类型的解释器传递数据,以试图找到有效的js语句。这将是非常处理器密集型的,可能会根据文本的性质产生许多误报。

    实体转义元字符可能是进一步保护应用程序免受筛选器可能错过的攻击的最佳方法。如果javascript作为常规文本加载,则无法运行。