Проверять и не печатать JavaScript в сгенерированных данных? - PullRequest
2 голосов
/ 01 октября 2008

Предположим, что в моем php-веб-приложении я хочу пройти лишнюю милю, и, кроме того, что я собираюсь разобраться с бандитами и сохраняю анал в отношении очистки входных данных, я также хочу убедиться, что в строках не выводится JavaScript. вставка в HTML-шаблоны.

Есть ли стандартный способ убедиться, что я не включил JavaScript в сгенерированный HTML-контент?

Ответы [ 4 ]

2 голосов
/ 01 октября 2008

Если вы не против внешних зависимостей, библиотека HTML Purifier - довольно хороший фильтр для большинства атак XSS.

0 голосов
/ 01 октября 2008

Я не думаю, что можно найти такой код JavaScript.

Вам нужно будет передать данные через интерпретатор некоторого типа, чтобы попытаться найти допустимые операторы js. Это будет очень трудоемким процессом и, вероятно, приведет к множеству ложных срабатываний в зависимости от характера вашего текста.

Выход из метасимволов сущности, вероятно, является лучшим способом дополнительной защиты вашего приложения от атак, которые ваш фильтр мог пропустить. Javascript не может быть запущен, если он загружен как обычный текст.

0 голосов
/ 01 октября 2008

В PHP я бы начал с strip_tags. Вот так:

$output = strip_tags($input);

Если бы я хотел разрешить некоторые теги в пользовательском вводе, я бы включил их, например, так:

$output = strip_tags($input, '<code><em><strong>');
0 голосов
/ 01 октября 2008

не совсем стандартный способ; потому что если бы ты делал <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 $_ ? $_ : "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...