我正在与Meteor开发聊天应用程序,我假设垃圾邮件将成为一个问题,所以如果你评论得太快(比如5秒内超过3次),我想加入弹出的Captcha。我有下面的javascript代码,但我不知道如何做到这一点。是否可以在屏幕上的某处弹出一个Captcha?如果是这样,有人知道怎么做吗?以下是聊天应用程序部分的代码:
使用Javascript:
// render all of our messages in the ui
Template.chatBox.helpers({
"messages": function() {
return chatCollection.find();
}
});
// get the value for handlerbar helper user
Template.chatMessage.helpers({
"user": function() {
if(this.userId == 'me') {
return this.userId;
} else if(this.userId) {
getUsername(this.userId);
return Session.get('user-' + this.userId);
} else {
return 'anonymous-' + this.subscriptionId;
}
}
});
// when Send Chat clicked at the message to the collection
Template.chatBox.events({
"click #send": function() {
if (Meteor.user() == null) {
alert("You must login to post");
return;
}
$('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
var message = $('#chat-message').val();
chatCollection.insert({
userId: 'me',
message: message
});
$('#chat-message').val('');
//add the message to the stream
chatStream.emit('chat', message);
},
"keypress #chat-message": function(e) {
if (Meteor.user() == null) {
alert("You must login to post");
return;
}
if (e.which == 13) {
$('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
console.log("you pressed enter");
e.preventDefault();
//repeat function from #send click event here
var message = $('#chat-message').val();
chatCollection.insert({
userId: 'me',
message: message
});
$('#chat-message').val('');
//add the message to the stream
chatStream.emit('chat', message);
}
}
});
chatStream.on('chat', function(message) {
chatCollection.insert({
userId: this.userId,
subscriptionId: this.subscriptionId,
message: message
});
});
答案 0 :(得分:2)
这听起来很棒,但使用“条件验证码”存在一些问题。一个是除了cookie和localStorage之外,JavaScript没有任何方法可以在页面重新加载之后继续存在。因此,简单的重新加载和清除cookie会使其失败。更不用说如何在服务器上处理它,这不确定它是否应该期望有效的验证码输入。
有了这个警告,您可以设置一个充当“计时器”的全局变量,并跟踪失效。所以用以下代码替换最后一个块:
chatStream.on('chat', function(message) {
//do we already have a timer?
if(typeof window.chatTimer == 'undefined'){
//no, so start one right now
window.chatTimer = new Date().getTime();
}else{
//we already have a timer. Is it 5 seconds old?
var now = new Date().getTime();
if( now - window.chatTimer < 5000) {
alert('Not so fast, tiger.');
return false;
}else{
chatCollection.insert({
userId: this.userId,
subscriptionId: this.subscriptionId,
message: message
});
}
此示例使用reCaptcha,减去您传入的自定义内容。
最近可能已经发生了变化,但Spambots并没有运行JavaScript。它们有点像搜索引擎爬虫,它们跟随链接并查找form
和textbox
元素,然后将它们的毒药编织到对表单的action属性的POST请求中,绕过任何想要阻止它的JavaScript。
事实上,验证码的替代方法之一就是使用JavaScript动态生成隐藏输入,该输入具有服务器等待的模糊ID /名称。 Spambots不会运行此JavaScript,因此永远不会生成复选框,因此机器人会在不知道原因的情况下被拒绝。 Here's more on that
答案 1 :(得分:1)
我在代码中添加了一些代码。我从不使用Meteor,所以我不知道这个代码在Meteor中是否有效。但是通过创建明喻项目here
进行测试Template.chatBox.events({
"click #send": function() {
if (Meteor.user() == null) {
alert("You must login to post");
return;
}
//Validation
var bot =Check_bots();
if(bot==false)
{
$('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
var message = $('#chat-message').val();
chatCollection.insert({
userId: 'me',
message: message
});
$('#chat-message').val('');
//add the message to the stream
chatStream.emit('chat', message);
}
else
{
// Do whatever you want when a Bot detected
}
},
"keypress #chat-message": function(e) {
if (Meteor.user() == null) {
alert("You must login to post");
return;
}
if (e.which == 13) {
$('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
console.log("you pressed enter");
e.preventDefault();
//repeat function from #send click event here
var message = $('#chat-message').val();
chatCollection.insert({
userId: 'me',
message: message
});
$('#chat-message').val('');
//add the message to the stream
chatStream.emit('chat', message);
}
}
});
以下是验证码
<script type="text/javascript">
var lastintime=0;
var defference=0;
var msg_count=0;
function Check_bots()
{
var seconds = new Date().getTime() / 1000;
seconds=parseInt(seconds);
if(lastintime < seconds)
{
defference = seconds -lastintime;
lastintime=seconds;
if(defference<=5 && msg_count>=3)
{
return true;
}
else
{
return false;
}
}
}
</script>