来自网站联系表单的垃圾邮件响应绕过“必需”和“模式”属性

问题描述 投票:3回答:1

我在一个收到大量垃圾邮件的网站上有一个联系表格。它在Github上托管,所以我的服务器端验证/验证码的方法非常有限。所有字段总是具有'required'属性,并且我在表单字段中添加了一些'pattern'属性和一个非常基本的安全问题。

最初我会收到所有字段已完成的垃圾邮件回复,但名称应该是随机数字,电话号码应该是的名称,电子邮件和邮件区域中的URL。

当我第一次添加javascript / jquery处理的安全问题时,它似乎没有任何效果所以我假设机器人可以从代码中读取正确的答案?更令人担忧的是,最近在表单字段中添加了一些“模式”属性后,我开始收到垃圾邮件响应,其中仍然包含名称应该是的随机数字,现在电话和电子邮件字段不存在(未提交) /进入)。

我不知道当字段与模式验证不匹配时如何提交字段,或者当两个字段仍具有“required”属性时如何留空。我已经自己测试了表单,所有验证和必填字段都按预期运行,并且所有字段都像以前一样被接收,所以它只是垃圾邮件发送者似乎忽略了这些规则。

如果有人可以请解释这里可能发生的事情/发生了什么?此外/或者,如果有人知道一种更好且经过验证的方法来清除垃圾邮件响应,这些垃圾邮件响应与我拥有的形式一致,并且在Github上托管网站的限制内将非常感激!!

如果您想在实时环境中查看表单,有问题的网站是http://orionimportgroup.com/

var n1 = Math.round(Math.random() * 10 + 1);
var n2 = Math.round(Math.random() * 10 + 1);

$('document').ready(function(){
	$("#a").val(n1 + " + " + n2);
	document.getElementsByName('captcha')[0].placeholder=("CAPTCHA CODE: " + n1 + "+" + n2);
});

$('form').submit(function(e) {
	if (eval($("#captcha").val()) == (parseInt(n1) + parseInt(n2))) {
		e.preventDefault();
		$.ajax({
			url: "https://docs.google.com/a/blakedavies.net/forms/d/e/1FAIpQLSfHdHMJePTJ3R5JOtBrH8zdPdX74eXQ8TDFIGjgkbIbGNdpnQ/formResponse",
			data: $(this).serialize(),
			type: "POST",
			dataType: "xml",
			success: function(data) {
				console.log('Submission successful');
			},
			error: function(xhr, status, error) {
				console.log('Submission failed: ' + error);
			}
		});
		$('#gform *').fadeOut(0);
		$('#contact-box *').fadeOut(0);
		$('#gform').prepend(
			'<div class="thank-you-box"><p class="thank-you">Hi, thanks for reaching out! We will get back to you within 24 hours.</p><p class="thank-you">If your issue cannot wait, you can also reach us via our <a href="https://www.facebook.com/Orion-Import-Group-110501569627947/">Facebook Page</a> or call 0429-105-580.</p></div>'
		);
		return true;
	}
	else{
		alert('You have not entered the correct captcha code value');
		return false;
	}
});
<form name="gform" id="gform" enctype="text/plain" action="https://docs.google.com/a/blakedavies.net/forms/d/e/1FAIpQLSfHdHMJePTJ3R5JOtBrH8zdPdX74eXQ8TDFIGjgkbIbGNdpnQ/formResponse">
  <div class="inner">
	  <input name="entry.1683926249" id="entry.1683926249" placeholder="Name" required pattern="[A-Za-z' -]+" oninvalid="setCustomValidity('Please enter a valid name using letters only.')" onchange="try{setCustomValidity('')}catch(e){}" />
		<input name="entry.189066148" id="entry.189066148" placeholder="Phone" required pattern="[0-9 -]+" oninvalid="setCustomValidity('Please enter a valid phone number using numbers only.')" onchange="try{setCustomValidity('')}catch(e){}" />
		<input name="entry.429019481" id="entry.429019481" placeholder="Email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,3}$" oninvalid="setCustomValidity('Please enter a valid email making sure to include an @ sign and the domain suffix (.com .net etc.).')" onchange="try{setCustomValidity('')}catch(e){}" />
	</div>
	<div class="inner">
		<textarea name="entry.2094840737" id="entry.2094840737" placeholder="Message" required></textarea>
		<input name="captcha" id="captcha" placeholder="CAPTCHA CODE: 5+7" required />
	</div>
  <input class="submit" name="submit" type="submit" value="Send Message" />
</form>
<script src="js/contactform.js" type="text/javascript"></script>
javascript jquery html validation spam-prevention
1个回答
3
投票

防止垃圾邮件的一种方法是使用Honeypot技术,它被证明能够为我公司的网站提供超过90%的垃圾邮件。

要实现Honeypot技术,所需要的只是在表单中添加隐藏的表单字段。

这就是表单提交是否是垃圾邮件的原因: 真实用户看不到隐藏字段,因此他们不会提交任何值。 但是,垃圾邮件机器人仍然会在表单的标记中看到该字段,并使用某些内容自动填充该字段,并将其与表单的其余部分一起提交。

因此,所有需要的是测试隐藏字段是否已提交值。如果是,则可以将提交视为垃圾邮件。

了解更多关于Honeypot technique的信息

对评论和其他信息的回复(我还不能发表评论)

@ user7531422,试试这样: 使用CSS样式将类添加到其他输入元素(honeypot元素)以隐藏它display: none;,并使其看起来与名称或电话字段相同但更改名称属性。 大多数机器人只会阅读HTML标记,并且不会注意到CSS规则,并且大多数机器人都不会那么聪明地深入到每一段代码中。

在直接提交表单之前,请检查您的隐藏字段是否有数据(如果不是空的则检查它的值),如果是,则不发送表单。 这是一个客户端解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.