-1

我正在尝试创建一个正则表达式来阻止所有字符串,除非与 <任何人都可以为此建议一个正则表达式吗?我将与.><select>.javax.util.Pattern

我正在尝试编写一个解决方案来阻止通过请求和 URL 进行的注入攻击和 XSS 尝试。为此,我将阻止特殊字符和字符序列,但有一些例外。一个例外是,我必须允许<select>(在它们之间有选择的尖括号),因为在某些情况下,它会被合法地传递到请求中。但是必须阻止所有其他尖括号组合。这就是我提出问题的原因。

4

3 回答 3

4

这会从字符串中删除 < 和 > 字符,除非它们是您提到的 <select> 的一部分:

someString.replaceAll("<(?!select>)|(?<!\\<select)>", "");
于 2009-01-14T21:03:45.667 回答
2
Pattern p = Pattern.compile(
  "(?<!\\<select)>|<(?!\s*select\s*>)",
  Pattern.CASE_INSENSITIVE);

这将发现 > 前面没有 <select 并且 < 后面没有 select> 允许它不区分大小写。

现在通常我会检查元素周围的(合法)空白(“ < select >”是有效的),但是后面的问题有我不确定如何解决的问题。

于 2009-01-14T21:07:58.997 回答
1

我怀疑它可以用一个正则表达式来完成,但将它分成几个阶段可能更容易,例如:

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

注意:这些都是文字字符串而不是正则表达式模式。我任意选择"@"了转义字符,但它可以是任何东西。

示例: "a <b> c <select> @ d"
步骤 1
“a <b> c <select> @0 d”
步骤 2
“a <b> c @1 @0 d”
步骤 3
“a b> c @1 @0 d”
步骤 4
“abc @1 @ 0 d”
步骤 5
“abc <选择> @0 d”
步骤 6
“abc <选择> @ d”

于 2009-01-14T20:57:27.050 回答