2014-04-21 126 views
2

我必须防止垃圾邮件发送请求到帐户创建页面(每个HTTP发布请求),但我不想使用验证码,也不能访问他们的IP(这是一个tor隐藏服务)。防止垃圾邮件未经验证码注册垃圾邮件

顺便说一句,我不能使用javascript(tor浏览器)。 有没有合理的方法来做到这一点?

+0

定义“验证码”。你必须做些什么来区分人类和机器人。你能问一个简单的问题 - 比如“我们称之为夜间在天空中看到的大物体”,大多数人可以回答“月球”,但机器人可能会挣扎吗? – Floris

+0

@namespace我遇到了类似的问题,最终使用Google Authenticator使用MFA(多因素身份验证)。验证码和蜜罐使它变得困难,但不能解决问题。 Captcha获得了可访问性问题,蜜罐领域可以由一个坚定的攻击者跳过。 –

回答

0

也许你可以希望做的最好的事情是衡量在你注册的输入框中打字的速度。一个人会花费“有限的时间”,而一个机器人基本上会“没时间”(尽管他们很快就会发现你在寻找这个并且适应)。但是这种测量需要运行“一些”客户端代码。

或者你可以给表单名称(这是用户不可见的)疯狂的名字:调用表单字段,人们必须输入他们的名字“ZIP”,很多机器人会在那里输入一个数字。

3

另一种解决办法是使用蜜罐:

  • 添加表单字段到表单和隐藏它从访问者查看(它离屏例如位);
  • 添加一个tekst通知访问者(屏幕阅读器...)将该字段留空;
  • 机器人很可能会填写所有表单域;
  • 放弃蜜罐字段填入(不为空)的所有表单提交。
+1

这并不能解决我的问题......攻击者可以轻松绕过此... – Borna

1

如果它是一个bot,比最可能的(但不是明确的)POST请求是基于您的表单参数提前手工制作的。在这种情况下,你可以在一个隐藏的输入中生成一个随机数,你将在POST中从“他的”会话/ cookie /任何内容中进行验证。

尽管最好的解决方案仍然是验证码。

+0

你的意思是......就像一个csrf标记? – namespace

+0

是的,我在发布时正在考虑CSRF。我认为它也可以在这里应用。 – dustfeather

0

你可以添加空白或预装的表单元素的形式不应修改:

<form method="post" action="createaccount.php"> 
    <input type="text" name="username" /> 
    <input type="password" name="password" /> 
    <input type="email" name="email" value="" placeholder="Leave me blank!" style="display: none;" /> 
    <input type="submit" name="submit" /> 
</form> 

然后在你的PHP:

<?php 
    if($_POST["email"] != "") 
    { 
     die("You must be a bot!"); 
    } 
?> 

如果BOT这种方法不好用理解CSS虽然。

更可以在这里找到:http://www.landauer.at/preventing-spam-in-form-submissions-without-using-a-captcha/

+0

有点晚了,我们可以使用'return' .. –

+1

@MihirUjjainwal'return'是用于当我在函数中返回一个值时。要尽早结束执行,您应该使用'die()'或'exit()'函数。 – starbeamrainbowlabs

0

MFA就是答案。 我遇到了类似的问题,最终使用Google Authenticator使用MFA(多因素身份验证)。验证码和蜜罐使它变得困难,但不能解决问题。验证码获得了可访问性问题,并且蜜罐字段可以被确定的攻击者跳过