【问题标题】:Confusion regarding regex pattern关于正则表达式模式的困惑
【发布时间】:2019-11-27 08:12:10
【问题描述】:

我试图编写一个正则表达式来捕捉句子中的某些单词,但它不起作用。以下正则表达式仅在我给出完全匹配时才有效。

[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))

假设我发送了一个 HTTP 标头 - headerName = insert 它有效,

但是当我给headerName = awesome insert number时不起作用

--编辑--

@user1180,是的,我可以使用准备好的语句,但我们也在研究正则表达式部分。

@Marcel 和 Wiktor,是的,它正在那个网站上运行。我想我的工具无法识别正则表达式。我正在使用 Mulesoft ESB,它使用 Matches when the evaluated value fits a given regular expression (regex), specifically a regex "flavor" supported by Java.

它正在使用这样的东西, matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ 我不知道如何以这种正则表达式格式编写我的用例。

我的用例太捕获 SQL 注入模式,它会检查请求标头/查询参数中的 delete (exec)(drop\s*table)(insert)(shutdown)(update)or 参数。

【问题讨论】:

  • 您要匹配的单词/术语的完整列表是什么?
  • 它确实对我有用。看到这个example
  • 这些看起来像 SQL 语句。你想阻止注射吗?如果是这样,通常最好使用准备好的语句。
  • 所以你只需要用(?s).*(<YOUR PATTERN>).*包装模式。试试(?s).*\b(delete|exec|drop\s+table|insert|shutdown|update|or)\b.*
  • 谢谢,Wiktor 正在运行。请保留它作为答案,我会接受它。顺便说一句,您是否推荐任何作为新手学习正则表达式的材料/网站?

标签: regex regex-lookarounds regex-negation


【解决方案1】:

由于您的正则表达式必须匹配整个输入,您需要使用.* 包装模式,类似于(?s).*(<YOUR PATTERN>).*

使用

(?s).*\b(delete|exec|drop\s+table|insert|shutdown|update|or)\b.*

详情

  • (?s) - 打开 DOTALL 模式,. 匹配任何字符
  • .* - 任何 0+ 个字符,尽可能多
  • \b(delete|exec|drop\s+table|insert|shutdown|update|or)\b - 组中的任何一个单词(注意\b 是单词边界结构)
  • .* - 任何 0+ 个字符,尽可能多

我还用drop\s+table 替换了drop\s*table,因为我猜droptable 不是预期的。

【讨论】:

  • 感谢您提供详细信息。顺便说一句,应该在上面的正则表达式中添加什么以进行不区分大小写的匹配?
  • 我希望这行得通(?s).*\b(?i)(delete|exec|drop\s+table|insert|shutdown|update|or)\b.*
  • @JohnSeen (?si).*\b(delete|exec|drop\s+table|insert|shutdown|update|or)\b.*
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2012-03-14
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多