正则表达式在反垃圾邮件脚本中得到误报

时间:2016-05-19 15:10:30

标签: php regex

我写了一些补充条件,以消除我在网站上收到的一些垃圾邮件。它大大减少了滥用,但也有一些误报的测试案例。有没有人建议如何避免其中的一些?

首先,代码搜索消息以确保不包含任何特定关键字。然后,使用两个正则表达式。

某些垃圾邮件是以随机字,字符和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" ..

0 个答案:

没有答案