Php 如何在没有验证码的情况下保护联系人表单?
在我的网站上,我有两个表单,其中有人(未注册)可以向指定的注册用户发送消息。表单很简单,我希望保持这种方式。如果我不想使用任何验证码,保护联系人表单免受垃圾邮件和机器人攻击的最佳方法是什么Php 如何在没有验证码的情况下保护联系人表单?,php,forms,Php,Forms,在我的网站上,我有两个表单,其中有人(未注册)可以向指定的注册用户发送消息。表单很简单,我希望保持这种方式。如果我不想使用任何验证码,保护联系人表单免受垃圾邮件和机器人攻击的最佳方法是什么 Your message:... Your e-mail:... [Send] 你可以做一些事情来证明用户是人类。如果你想保持简单,可以找一个字段问一个数学问题,比如“2+5”。但这并不像验证码那样安全。但是,如果可能的垃圾邮件没有破坏你,那么这样做是可以的。你可以从IP实施时间限制。因此,如果垃圾邮件机器
Your message:...
Your e-mail:...
[Send]
你可以做一些事情来证明用户是人类。如果你想保持简单,可以找一个字段问一个数学问题,比如“2+5”。但这并不像验证码那样安全。但是,如果可能的垃圾邮件没有破坏你,那么这样做是可以的。你可以从IP实施时间限制。因此,如果垃圾邮件机器人尝试一次又一次地发送表单(在特定的时间间隔内,例如1小时),那么请求应该被拒绝 您必须在服务器端通过检查和存储用户的IP来实现这一点。然后,当他们再次发送表单时,检查用户是否已经在被阻止的IP中 这也是20年前的情况。因此选项:
在我看来,最好的解决方案是解决方案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 } ?>
在我看来,许多网站(售票员、像谷歌这样的主要网站以及其他目标网站除外)可以通过使用多种不同的技术组合,在没有验证码的情况下防止评论/形成垃圾邮件。我最近创建了一个开源PHP项目,它实现了以下测试,以确定提交的内容是否可能是合法的,或者是垃圾邮件
- 隐藏表单字段-如果填写了隐藏表单字段,则表示垃圾邮件
- 表单提交时间-如果表单填写过快或过慢,则表示存在垃圾邮件
- URL过多-如果注释字段的URL过多(数量可配置),则表示垃圾邮件
- 鼠标移动-如果用户不使用鼠标,则表示垃圾邮件
- 使用过的键盘-如果用户不使用键盘,则表示垃圾邮件
- 验证引用器-如果HTTP引用器与表单URL不匹配,我们不应该接受提交
- 验证电子邮件-如果表单中提供的电子邮件地址从语法角度来看无效,我们不应接受提交
这是该项目的URL。我喜欢上面Kaii的测试,这将是PHP保护的一个很好的附加测试。
使用:
它基本上接受一个字符串(您的表单html在PHP中存储为字符串)并生成一块模糊的Javascript
它可以帮助隐藏您用来保护表单安全的表单密钥,或者对所有机器人程序完全隐藏表单
我从90年代开始使用它(上面链接处的页面显然至少有那么旧),我从来没有收到过表单垃圾邮件。检查服务器端和客户端是否有明确的验证,并创建邮件功能,不保存在数据库中保护什么?如果是垃圾邮件机器人,那么验证码的目的是区分机器人和人类,因此所有机器人保护机制都属于这个总括术语。相关:可能重复?为什么不?如果问题是以正确的形式提出的,它可能比克林贡语更清楚captcha@Alfabravo没错,我经常很难阅读capthcas(是的,我指的是你,StackOverflow)。一张有破损字母的图片是sooo 2006。一些脚本可以捕获文本并解决问题,这就是我为什么指出它的原因。谢谢,这非常有用。我想我会先关注第4点,然后关注第1点。谢谢。这很好