使用 MySQL 检测垃圾邮件发送者

Pau*_*aul 5 php mysql spam

我看到越来越多的用户在我的网站上注册,只是为了向其他用户发送重复的垃圾邮件消息。我添加了一些服务器端代码来使用以下 mysql 查询检测重复消息:

  SELECT count(content) as msgs_sent 
    FROM messages 
   WHERE sender_id = '.$sender_id.' 
GROUP BY content having count(content) > 10
Run Code Online (Sandbox Code Playgroud)

查询运行良好,但现在他们通过更改消息中的一些字符来解决这个问题。有没有办法用 MySQL 检测到这一点,或者我是否需要查看从 MySQL 返回的每个分组,然后使用 PHP 来确定相似度的百分比?

有什么想法或建议吗?

Mic*_*son 4

全文匹配

您可以考虑实现类似于此处MATCH示例的内容:

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

因此,对于您的示例,也许:

SELECT id, MATCH (content) AGAINST ('your string') AS score
FROM messages 
WHERE MATCH (content) AGAINST ('your string')
    AND score > 1;
Run Code Online (Sandbox Code Playgroud)

请注意,要使用这些函数,您的content列需要是一个FULLTEXT索引。

score这个例子里有什么?

它是一个relevance value。它是通过以下描述的过程计算的:

集合和查询中的每个正确单词根据其在集合或查询中的重要性进行加权。因此,出现在许多文档中的单词具有较低的权重(甚至可能具有零权重),因为它在该特定集合中具有较低的语义价值。相反,如果该词很少见,则它的权重较高。组合单词的权重来计算行的相关性。

文档页面。