没有使用 PHP 如何保护Web联系表单免受垃圾邮件的攻击?

4
我需要为现有的网页联系表单实现一种防止垃圾邮件的保护(验证码等)。然而,原始表单使用了一个我无法访问的虚拟服务器上的 .cgi 文件,因此我无法使用这个脚本。PHP邮件函数已关闭。
我猜我需要自己的cgi文件,但我不太懂perl和cgi :-)
也许你可以指引我解决这个问题的办法。
2个回答

4

如果您假设所有用户都已启用JavaScript,则可以创建某种倾斜的反机器人功能。

将表单的action设置为某个404页面,在JavaScript中将其更改回正确的action页面。示例:

<form action="nowhere_ahaha" id="myform">
   ...
</form>
<script>
document.getElementById('myform').action = '/form_action.cgi';
</script>

所有这些都有效,因为机器人通常不运行js,但人类访问者会运行。

至少您可以告诉人类访问者,如果禁用了JavaScript,则该表单将无法工作。 - hakre
1
@Saxoier,是的,但Google机器人不会发送垃圾邮件。我的垃圾邮件机器人使用Rhino来运行JS :) - Oroboros102
这是一个简单的证明,证明“[...]机器人不运行js[...]”是不正确的。 - Saxoier

4
您可以添加一个负面验证码:

负面验证码的目的与普通图像验证码相同: 防止机器人提交表单。 图像(“正面”)验证码通过实现只有人类才能完成的步骤来实现这一点,但机器人无法完成: 从图像中阅读混乱的字符。 但这是不好的。 它会产生可用性问题,降低转化率,并使许多人感到困惑。 为什么不反其道而行之呢? 负面验证码创建了一个只有机器人可以执行而人类无法执行任务的表单。 这具有完全相同的效果,并且(据说)与正面验证码相比,误报率要低得多。 所有这些都不会使人类在提交表单时额外麻烦。 这真的是双赢。 [来源]

在您的情况下,您最好使用蜜罐:添加一个新字段:

<div style="position: absolute; left: -2000px;"><input type="text" name="surname"  value="" /></div>

假设您不想收到姓氏信息。如果人们设法填写并提交此字段,则很可能是机器人:正常浏览器不会显示该字段:普通用户将看不到它,因此不会填写。

现在,在您的CGI脚本中,只需过滤“surname”即可;如果设置了,请停止处理并提供错误,或者就这样离开它。

或者,如果不可能,请尝试通过“没有设置姓氏的记录”来过滤已发布表单的结果。例如,如果您在excel / CSV中获取结果:只需使用excel来过滤掉具有姓氏的项目。或使用您的电子邮件过滤器将任何具有姓氏值的邮件移动到特殊目录中。


这是一个很棒的想法,我会在我的网站上尝试它。 - davidjwest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接