RGJ
(Richard - Communiteq)
1
在将大量被监控的词汇转换为正则表达式时,我发现了一些绕过过滤器的方法。这些方法对“普通”监控词汇和正则表达式均有效。
双空格:如果您的监控词汇是 forbidden word,那么通过在两个单词之间插入多个空格即可绕过。有趣的是,经过处理的帖子会自动移除双空格,因此在最终文本中完全不可见。
- 使用正则表达式防止此问题:使用
forbidden\s*word
- 不使用正则表达式防止此问题:我尚未找到解决方案。
使用下划线来绕过单词边界:
不使用正则表达式:如果将监控词汇用下划线包围,它将以斜体显示,并会被允许通过。因此,如果您的过滤器是 forbidden,那么 _forbidden_ 将被接受。
使用正则表达式:通常只有在您使用 \b 时才会检查单词边界,而下划线会使其失效。因此,如果您的过滤器是 \bforbidden\b,那么 _forbidden_ 将被接受。
- 使用正则表达式防止此问题:使用
[\b\_] 替代 \b
编辑:这似乎效果不佳。
移除单词边界或许也有效,但这样可能会意外阻止像 cumulative 和 title 这样的词汇;)
- 不使用正则表达式防止此问题:我尚未找到解决方案。
7 个赞
没错,这类问题我们通常不会花时间争论,因为总有各种“巧妙”的绕过文字黑名单的“技巧”。Unicode 是一个极其庞大的空间。
4 个赞
Stephen
(Stephen)
3
确实,我们之前在多个大型教育项目中尝试过这样做。
在该项目被搁置之前,他们上线了模糊匹配功能,这不可避免地给合法用例带来了各种问题。
3 个赞
riking
(Kane York)
4
受监控的词汇主要作为对抗不良词汇的“第一道防线”。你仍然需要社区来标记变通方法和违规行为。
无论你想出什么样的正则表达式,都无法检测到
。
9 个赞
elijah
(Eli the Bearded)
5
顺便提一下,[] 用于“字符类”。在 Perl 正则表达式中(可能 Ruby 也是如此),\b 在字符类之外表示“单词边界”,而在字符类之内则表示“退格”。在 C 语言中,\b 始终是退格(准确说是 )。退格字符在大多数情况下并不实用,而单词边界则很有用,因此才有了这种重新定义。
若要使用正则表达式匹配“forbidden”或“forbidden”,我可能会使用:
\b_?forbidden_?\b
(我也知道如何将我的所有字母进行 &#xXXXX; 编码,以避免 Unicode 陷阱或正则表达式问题。)
3 个赞
RGJ
(Richard - Communiteq)
6
我从未意识到根据上下文会有这样的区别。感谢你的解释!
2 个赞