在我的网站上,我有几种形式,其中某人(没有注册)可以向指定的注册用户发送消息.形式很简单,我想保持这种方式.如果我不想使用任何验证码,保护联系表单的最佳方法是反击垃圾邮件和机器人?
Your message:...
Your e-mail:...
[Send]
Run Code Online (Sandbox Code Playgroud)
所以选项:
详细介绍了这些以及我对它们的看法.
在我看来,最好的是解决方案3,然后是解决方案2,然后是解决方案1,然后是解决方案4和5.
您可以使用表单键技术保护表单:
如果没有验证码或类似的东西,就不可能真正保护表格免受滥用.
但是,使用这种技术的恶意垃圾邮件发送者必须这样做
据我所知,没有自动垃圾邮件联系表单爬虫可以做到这一点.
此技术还可以保护您的表单免受多次提交的提交.
这是一个代码示例:
<?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 } ?>
Run Code Online (Sandbox Code Playgroud)
在我看来,许多网站(除了卖票卖家,谷歌等主要网站以及其他将被定位的网站)可以通过组合使用多种不同的技术来防止评论/形式垃圾邮件而无需验证码.我最近创建了一个开源PHP项目,它实现了以下测试,以确定提交是否合法或垃圾邮件.
这是项目的URL.我喜欢上面的Kaii测试,会为phpFormProtect做一个很好的额外测试. https://github.com/mccarthy/phpFormProtect