【问题标题】:Using REGEX to find keywords使用正则表达式查找关键字
【发布时间】:2016-02-02 15:53:26
【问题描述】:

大家好,我有以下 badwords,我想检查它们是否在我传递的字符串中:

Private Function injectionCheck(queryString As String) As Integer
    Dim badWords() As String = {"EXEC", "EXECUTE", ";", "-", "*", "--", "@",
                                "UNION", "DROP", "DELETE", "UPDATE", "INSERT", "MASTER",
                                "TABLE", "XP_CMDSHELL", "CREATE", "XP_FIXEDDRIVES", 
                                "SYSCOLUMNS", "SYSOBJECTS"}
    Dim pattern As String = "\b(" + Regex.Escape(badWords(0))

    For Each key In badWords.Skip(1)
        pattern += "|" + Regex.Escape(key)
    Next

    pattern += ")\b"

    Return Regex.Matches(queryString, pattern, RegexOptions.IgnoreCase).Count
End Function

对于模式,我得到以下信息:

\b(EXEC|EXECUTE|;|-|\*|--|@|UNION|DROP|DELETE|UPDATE|INSERT|MASTER|TABLE|XP_CMDSHELL|
   CREATE|XP_FIXEDDRIVES|SYSCOLUMNS|SYSOBJECTS)\b

这对我来说是正确的。但每次我调用它时,我都会得到 0 作为对此的回应:

Dim blah As Integer = injectionCheck("select * from bob where something = 'you'")

那么我遗漏了什么,因为上面不应该返回 0 - 它应该返回 2 因为 * 和 ' 使用了不应该使用的。

【问题讨论】:

  • 字符串与模式不匹配。问题在于\b。

标签: regex vb.net keyword


【解决方案1】:

如果您打算将单词作为整个单词进行匹配,但关键字可能以非单词字符开头/结尾,您可能会遇到类似的麻烦。单词边界含义取决于上下文:\b--\b 将匹配 X--X 但不匹配 , --,。

您需要明确的边界匹配。使用lookarounds (?<!\w) 作为前导,(?!\w) 作为尾随词边界。

实现如下所示的更改:

Dim pattern As String = "(?<!\w)(" + Regex.Escape(badWords(0)) ' <== HERE

For Each key In badWords.Skip(1)
    pattern += "|" + Regex.Escape(key)
Next

pattern += ")(?!\w)"  ' <== AND HERE

【讨论】:

  • 很好,维克托。谢谢!
猜你喜欢
  • 2018-08-10
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多