我写了一些补充条件,以消除我在网站上收到的一些垃圾邮件。它大大减少了滥用,但也有一些误报的测试案例。有没有人建议如何避免其中的一些?
首先,代码搜索消息以确保不包含任何特定关键字。然后,使用两个正则表达式。
某些垃圾邮件是以随机字,字符和4位以上的整数字符串形式出现的,因此第一个正则表达式会检查并阻止这些情况。但是,当用户引用其他用户发帖时,它会使用字符>>> +帖子编号',返回误报。
我添加了另一个处理条件,其中包含>>的帖子加3位或更多位数将被忽略。
到目前为止,代码大部分都有效,但是在测试中我已经注意到了句子"我有2000只鸡"报告误报,因为空格包含在第一个正则表达式的任何字符条件中。我可以很容易地不计算这里的空格字符,但是一些垃圾邮件就是那种形式("随机字23450")。
到目前为止我的代码:
foreach ($bannedwords as $bannedphrase) {
//see if banned phrase is in the message body
$pos = strpos($lowercaseBody, $bannedphrase);
//if it is, or if it contains the regex expression, ban the user.
if ($pos !== FALSE || preg_match('/.+\d{4}/', $lowercaseBody) && !preg_match('/[>>]+\d{3}/', $lowercaseBody)){
require_once 'inc/mod/ban.php';
Bans::new_ban($_SERVER['REMOTE_ADDR'], 'Suspected Spammer.', '86400', $_POST['board'] == '*' ? false : $_POST['board']);
error($config['error']['bannedword']);
}
}
表达式[^] + \ d {4}用于允许误报,但再次允许以"随机3459"形式的垃圾邮件。
从垃圾邮件机器人发布的一些示例包括: demetrius3204 dialog.2345 距离33456 神$ 4598
最初所有的帖子都有5位以上的数字,但它[或者垃圾邮件发送者]知道我的反制措施并改为4位数,所以我再次改变,似乎就是这个伎俩。
然后有一些帖子,像#34; weorasdsodfh"或" asdfjk" ..