AJAX聊天-防止垃圾邮件服务器侧


AJAX chat - Prevent spam server sided?

任何人都可以在ajax聊天中使用简单的for循环,并使聊天一次发送1000条消息。在我的ajax聊天中,每条消息都存储有日期、时间(时间戳)。

我需要找到一种方法来防止这个问题,我想过一个,但我不确定我该怎么做:

通过投递时间防止垃圾邮件

基本上选择5条他们约会的消息,时间显示不到10秒(在一起)。如果这些消息在不到10秒内一起发布,则会阻止用户进行几秒钟的聊天。

但我真的不认为这可行,也不知道如何做到这一点

是否有类似的或更好的解决方案,或如何操作的提示?

EDIT:如果您有可用的数据库资源,DanFromGermany发布的解决方案是一个好方法。如果DB是一个瓶颈,您可以切换到以下方法:

您有一个对php文件的AJAX调用,比如process.php。在process.php中,您启动一个会话,并启动一个值$_session['lastChatMessage']=0;

然后你在实际代码附近做一个if/else:

// time based check:
if($_SESSION['lastChatMessage'] > time()-1 ){ echo "Only one post per second";}
else{
    // some code you use now
    $_SESSION['lastChatMessage'] = time();// save time of posting
}

你也可以制作一个$lastChatMessage数组,并记住其中的每一个时间。然后制作一个函数,删除所有小于time()的值-$diffYouWant。许多帖子将保留,这取决于你希望这个数字有多大:)

if(count( $_SESSION['lastChatMessage']) > $maxPostsAllowed){ echo 'No flooding please';}
else{
    // your code
}

在脚本的服务器即将保存聊天消息的部分,您可以挂接一个类似的数据库查询

SELECT COUNT(*)
FROM chat_messages
WHERE uid='1234' AND timestamp > DATE_SUB(NOW(), INTERVAL 10 SECOND)
LIMIT 10

然后检查结果是否大于您的限制并返回false,或者显示"短时间内发送了太多消息"

另一种可能更好的方法是不仅识别用户/会话,而且保存IP并将消息限制到一个IP。许多现代机器人可以很容易地绕过会话或快速切换IP,所以你应该选择多种技术的组合。

还应考虑客户端预防,如对消息进行哈希处理或向消息添加校验和。许多机器人不会说JavaScript太好。

您希望在服务器端控制这一点,正如其他评论中所提到的,垃圾邮件发送者可能知道足够的JavaScript来删除任何保护。

使用PHP和MySQL,这里有一个建议:

// check if the user is spamming
$r_antispam = mysqli_query($db, "SELECT `date` FROM `the_messages` WHERE `id_conversation`=111 AND `id_exp`=222 AND `date` >= DATE_SUB(NOW(), INTERVAL 10 SECOND) LIMIT 8");
if(mysqli_num_rows($r_antispam) == 8)
{ echo 'spam'; exit(); }

当然,您可能需要调整延迟和允许的最大消息数。

现在,在Ajax请求中,您可以使用单词"垃圾邮件";Ajax文件以这种方式返回:

$.post("ajax/messages-post.php", {
    id_conv: 111, 
    message: message_text 
}).
done(function(e)
{
    if(e == 'spam')
    {
        alert('do not spam, please...');
    }
    else
    {
        // your message is posted, you can display it
    }
}).
fail(function() { console.log('error'); });

在JavaScript中,如果在将其值发布到Ajax文件之前清空用户编写消息的文本区域,因为消息不会记录在数据库中,您可以将其重新插入文本区域,以防它不是垃圾邮件。。。