我网站上有几个表单,任何人(无需注册)都可以向指定的已注册用户发送消息。这种表单很简单,我希望保持这种方式。如果我不想使用任何验证码,那么保护联系表单免受垃圾邮件和机器人的最佳方法是什么?
Your message:...
Your e-mail:...
[Send]
我网站上有几个表单,任何人(无需注册)都可以向指定的已注册用户发送消息。这种表单很简单,我希望保持这种方式。如果我不想使用任何验证码,那么保护联系表单免受垃圾邮件和机器人的最佳方法是什么?
Your message:...
Your e-mail:...
[Send]
<?php
session_start();
if (isset($_POST['form_submit'])) {
// do stuff
if (isset($_POST['formkey']) && isset($_SESSION['formkeys'][$_POST['formkey']])) {
echo "valid, doing stuff now ... "; flush();
// delete formkey from session
unset($_SESSION['formkeys'][$_POST['formkey']]);
// release session early - after committing the session data is read-only
session_write_close();
// do whatever you like with the form data here
send_contact_mail($_POST);
}
else {
echo "request invalid or timed out.";
}
}
else {
// show form with formkey
$formkey = md5("foo".microtime().rand(1,999999));
// put current formkey into list of valid form keys for the user session
if (!is_array($_SESSION['formkeys']) {
$_SESSION['formkeys'] = array();
]
$_SESSION['formkeys'][$formkey] = now();
?>
<html>
<head><title>form key</title></head>
<body>
<form method="POST">
<input type="hidden" name="PHPSESSID" value="<?=session_id()?>">
<input type="text" name="formkey"
value="<?= $formkey ?>">
<input type="submit" name="form_submit" value="Contact us!">
</form>
</body>
</html>
<?php } ?>
这是该项目的URL。我喜欢Kaii上面的测试,它会成为phpFormProtect的一个很好的附加测试。 https://github.com/mccarthy/phpFormProtect
因此有以下选项:
这些选项的详细信息以及我的意见。
在我看来,最好的解决方案是3,然后是2,然后是1,接着是4和5。
您可以从IP地址实现时间限制。因此,如果垃圾邮件机器人尝试在特定时间间隔(例如1小时)内一遍又一遍地发送表单,则应拒绝请求。
您需要在服务器端执行此操作,通过检查和存储用户的IP地址来完成。然后,当他们再次发送表单时,请检查用户是否已被阻止IP地址。
这也是StackOverflow 2年前实施的方法。
使用:iScramble
它基本上接受一个字符串(您在PHP中存储的表单HTML作为字符串)并生成一块混淆的Javascript代码。
它可以帮助隐藏用于保护表单的表单密钥,或者完全将您的表单从机器人中隐藏起来。
自90年代以来,我一直在使用它(以上链接中的页面显然至少有那么老),我从未收到过表单垃圾邮件。
您可以采取一些措施来证明用户是人类。如果您想保持简单,也许可以提供一个数学问题的字段,例如“2 + 5?”但这并不像验证码那样安全。但是,如果可能的垃圾邮件不会打扰您,那么这样做就可以了。