contact-form - PHP 联系表单的高级反垃圾邮件措施
问题描述
接收到令人困惑的垃圾邮件,这在我制定的反垃圾邮件和表单要求下是不可能的,因此我需要帮助确定如何攻击这个特定的机器人。
我的网站上有一个简单的联系我表格,它使用 PHP 向我发送电子邮件。它通过 PHP 运行。每天大约 3 次,我收到一封电子邮件,其中表格填写了“1”,例如姓名:1,电子邮件:1,消息:1。我有我的字段所需的电子邮件格式(需要 @whatever.com ),我有一个验证码并且我安装了一个蜜罐,但仍然收到这些电子邮件。
我的表格和验证码:
<form method="post" action="contact.php">
<label class="contenttext">Your Name:</label>
<input name="senderName" class="inputemail" required="required"><br/><br/>
<label class="contenttext">Your Email Address:</label>
<input name="senderEmail" class="inputemail" type="email" required="required"><br/><br/>
<!-- HONEYPOT --><input type="text" id="catcher" name="catcher"/>
<textarea name="message" required="required"></textarea><br/><br/>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div class="g-recaptcha" data-sitekey="(mysitekey)"></div>
<br/>
<div class="capfail" id="capfail">Please check the Captcha box.</div><br/>
<script>
$("form").submit(function(event) {
var recaptcha = $("#g-recaptcha-response").val();
if (recaptcha === "") {
event.preventDefault();
$("#capfail").show();
}
});
</script>
还有我的 PHP 代码:
<?php
$webmaster_email = "myemail@gmail.com";
$feedback_page = "contact.html";
$error_page = "404.shtml";
$thankyou_page = "contactsuccess.html";
$senderEmail = $_REQUEST['senderEmail'] ;
$message = $_REQUEST['message'] ;
$senderName = $_REQUEST['senderName'] ;
$msg =
"First Name: " . $senderName . "\r\n" .
"Email: " . $senderEmail . "\r\n" .
"\r\n" . "Message: " . "\r\n" . $message ;
function isInjected($str) {
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str)) {
return true;
}
else {
return false;
}
}
if (!isset($_REQUEST['senderEmail'])) {
header( "Location: $feedback_page" );
}
elseif (empty($senderName) || empty($senderEmail)) {
header( "Location: $error_page" );
}
elseif ( isInjected($senderEmail) || isInjected($senderName) || isInjected($message) ) {
header( "Location: $error_page" );
}
elseif(!empty($_POST['catcher'])) {
header( "Location: $error_page" );
}
else {
mail( "$webmaster_email", "Feedback Form Results", $msg );
header( "Location: $thankyou_page" );
}
?>
这应该有效地阻止使用蜜罐自动填充机器人,检查是否有人使用验证码,并要求字段适合特定格式。我还有什么遗漏的吗,或者任何人都可以帮助我了解我仍然会收到这样的电子邮件吗?
更新: 有人指出我没有使用服务器端验证。我可以设置服务器端,但是这样做会破坏我的 HTML 表单中的显示/隐藏 div 代码。有没有办法提交表单,直接到 PHP 文件,让我的 PHP 检查验证码是否被检查,如果没有,将用户带回 HTML 文件(理想情况下,他们的表单仍然填写,所以什么都不会丢失)和显示小“请检查验证码”框。消息就像我现在设置的一样?
解决方案
您在客户端而不是服务器上强制执行 CAPTCHA。打败它所需要的只是让客户端禁用 JavaScript。您绝对需要在服务器上进行所有安全检查。
推荐阅读
- mongodb - 您是否在 JDK14 中使用了响应式 mongodb 驱动程序
- azure-eventhub - 是否可以通过 PartitionKey 而不是 PartitionId 配置 Azure 事件中心捕获文件名?
- c++ - 为什么 GLFW 在释放键后会调用键回调函数几秒钟?
- python - 我的 python 打印 trie 函数无法打印 - RecursionError:比较超出最大递归深度
- python - 使用 Python 写入 Excel 中的精确单元格
- azure - 无法解析请求 - MissingJsonReferenceId:使用 PowerShell Az 命令创建 NIC 时出错
- c++ - 从返回抽象类的函数返回 NULL
- python - 位于 MDI 区域中心的 PyQt 用户徽标
- javascript - 将 Google 地方信息搜索限制在坐标或地点周围特定边界内的地方
- javascript - 如何检查 React JS 应用中使用的第三方库的漏洞?