【问题标题】:Regex to block all < in a String正则表达式阻止字符串中的所有 <
【发布时间】:2010-10-01 11:17:58
【问题描述】:

我正在尝试创建一个正则表达式来阻止字符串中的所有&lt;&gt;,除非与&lt;select&gt;. 一起使用时有人可以为此建议一个正则表达式吗?我将与javax.util.Pattern 一起使用它。

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

【问题讨论】:

  • 你所说的“阻止”是什么意思。消除?拒绝字符串?
  • 如果你想用这类东西来保证不受信任的输入安全,那么你只会泪流满面。
  • 罗伯特:这里的块意味着拒绝。一旦我看到任何“坏”字符序列,我就会将用户注销并显示错误消息。汤姆:谢谢你的评论。您能否解释一下您的评论,以便我采取纠正措施。谢谢
  • 汤姆:谢谢你的评论。您能否解释一下您的评论,以便我采取纠正措施。非常感谢您的帮助。

标签: java regex sanitization


【解决方案1】:

这会从字符串中删除 字符,除非它们是您提到的

someString.replaceAll("<(?!select>)|(?<!\\<select)>", "");

【讨论】:

  • 感谢乔丹的回答。我想用 Pattern 类编译它。您的回答很好地指出了解决方案。非常感谢。不幸的是,我无法增加积分,因为我自己需要 15 分!
【解决方案2】:
Pattern p = Pattern.compile(
  "(?<!\\<select)>|<(?!\s*select\s*>)",
  Pattern.CASE_INSENSITIVE);

这将发现 > 前面没有

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

【讨论】:

  • 感谢您的回复。但它给出了如下异常:java.util.regex.PatternSyntaxException: Look-behind group 在索引 17 附近没有明显的最大长度 (?select\s)> |)
  • 已更正。忘记了lookbehinds和通配符。
  • 好的,没问题。非常感谢,给点指点。现在,如果我必须写相反的内容,这意味着如果我必须找到没有
  • 您可能需要编辑您的问题,以便我们了解您想要做什么以及为什么。例如,替换 是一个奇怪的要求,因为用它们替换 是防止嵌入标签的通常防御措施。 不会被我知道的任何东西渲染。
  • 对不起,第一次在这里发问题,不清楚。这就是我的分数变为 -2 的原因 :(。我现在正在编辑问题,以使其更清楚。顺便说一句,您的解决方案按原样工作(但不考虑空格),非常感谢。
【解决方案3】:

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

  1. "@" => "@0"
  2. "&lt;select&gt;" => "@1"
  3. "&lt;" => ""
  4. "&gt;" => ""
  5. "@1" => "&lt;select&gt;"
  6. "@0" => "@"

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

示例: "a <b> c <select> @ d"
步骤 1
"a c @0 d"
第 6 步
"a b c

【讨论】:

  • 感谢您的回复。我希望用 Pattern.match(input String).find() 编译它。所以,对我来说,一个单一的正则表达式会更适合。你能给些建议么?非常感谢
  • 我的方法更适合 String.replace(x, y)。如果必须是单个正则表达式,请参阅 Jordan Liggitt 的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2017-01-08
相关资源
最近更新 更多