Regex, чтобы заблокировать все <в строке - PullRequest
0 голосов
/ 14 января 2009

Я пытаюсь создать регулярное выражение, чтобы заблокировать все < и > в строке, кроме случаев использования с <select>. Кто-нибудь может предложить для этого регулярное выражение? Я буду использовать его с javax.util.Pattern.

Я пытаюсь написать решение для блокировки атаки с помощью инъекций и попыток XSS с помощью запроса и URL-адреса. Для этого я буду блокировать специальные символы и последовательности символов, но с некоторыми исключениями. Одним из исключений является то, что я должен разрешить <select> (угловые скобки с выбором между ними), потому что в некоторых случаях это законно передается в запрос. Но все остальные комбинации угловых скобок должны быть заблокированы. И это причина моего вопроса.

Ответы [ 3 ]

4 голосов
/ 15 января 2009

Это удаляет символы <и> из строки, если они не являются частью

someString.replaceAll("<(?!select>)|(?<!\\<select)>", "");
2 голосов
/ 15 января 2009
Pattern p = Pattern.compile(
  "(?<!\\<select)>|<(?!\s*select\s*>)",
  Pattern.CASE_INSENSITIVE);

Это обнаружит, что> не предшествует

Теперь обычно я проверяю (легальные) пробелы вокруг элемента ("< select >" является допустимым), но у взгляда есть проблемы, с которыми я не совсем уверен, как обойти.

1 голос
/ 14 января 2009

Я подозреваю, что это можно сделать с помощью одного регулярного выражения, но может быть проще разбить его на этапы, например:

  1. "@" => "@0"
  2. "<select>" => "@1"
  3. "<" => ""
  4. ">" => ""
  5. "@1" => "<select>"
  6. "@0" => "@"

Примечание: это все буквенные строки, а не шаблоны регулярных выражений. Я произвольно выбрал "@" в качестве escape-символа, но это может быть что угодно.

* * Пример тысяча тридцать один: "a <b> c <select> @ d"
шаг 1
"a c
...