观看单词技巧

在将大量被监控的词汇转换为正则表达式时,我发现了一些绕过过滤器的方法。这些方法对“普通”监控词汇和正则表达式均有效。

双空格:如果您的监控词汇是 forbidden word,那么通过在两个单词之间插入多个空格即可绕过。有趣的是,经过处理的帖子会自动移除双空格,因此在最终文本中完全不可见。

  • 使用正则表达式防止此问题:使用 forbidden\s*word
  • 不使用正则表达式防止此问题:我尚未找到解决方案。

使用下划线来绕过单词边界:
不使用正则表达式:如果将监控词汇用下划线包围,它将以斜体显示,并会被允许通过。因此,如果您的过滤器是 forbidden,那么 _forbidden_ 将被接受。
使用正则表达式:通常只有在您使用 \b 时才会检查单词边界,而下划线会使其失效。因此,如果您的过滤器是 \bforbidden\b,那么 _forbidden_ 将被接受。

  • 使用正则表达式防止此问题:使用 [\b\_] 替代 \b
    编辑:这似乎效果不佳
    移除单词边界或许也有效,但这样可能会意外阻止像 cumulativetitle 这样的词汇;)
  • 不使用正则表达式防止此问题:我尚未找到解决方案。
7 个赞

没错,这类问题我们通常不会花时间争论,因为总有各种“巧妙”的绕过文字黑名单的“技巧”。Unicode 是一个极其庞大的空间。

4 个赞

确实,我们之前在多个大型教育项目中尝试过这样做。

在该项目被搁置之前,他们上线了模糊匹配功能,这不可避免地给合法用例带来了各种问题。

3 个赞

受监控的词汇主要作为对抗不良词汇的“第一道防线”。你仍然需要社区来标记变通方法和违规行为。

无论你想出什么样的正则表达式,都无法检测到 image

9 个赞

顺便提一下,[] 用于“字符类”。在 Perl 正则表达式中(可能 Ruby 也是如此),\b 在字符类之外表示“单词边界”,而在字符类之内则表示“退格”。在 C 语言中,\b 始终是退格(准确说是 )。退格字符在大多数情况下并不实用,而单词边界则很有用,因此才有了这种重新定义。

若要使用正则表达式匹配“forbidden”或“forbidden”,我可能会使用:

\b_?forbidden_?\b

(我也知道如何将我的所有字母进行 &#xXXXX; 编码,以避免 Unicode 陷阱或正则表达式问题。)

3 个赞

我从未意识到根据上下文会有这样的区别。感谢你的解释!:slight_smile:

2 个赞