隐藏字段验证码足够安全吗?

6
在我的网站上,我不想使用那些扭曲的文本验证码。因此,我决定采用隐藏字段验证码。
例如:
<form>

<input type="text" name="surprise" value="" style="display: none; visibility: hidden;"/>

</form>

真正的用户不会看到这个字段,因此他们会将其留空,而垃圾邮件机器人则会填写它。然后我可以检查“惊喜”字段是否为空,如果为空,则继续进行。

但是我现在对这种方法提出了疑问,我认为它不太安全。那么你能否建议其他更安全的方法吗?有没有其他不需要用户输入图像文本的验证码方法?


你怎么知道他们会填写呢?我以前运营过论坛,不是所有的字段都被垃圾机器人填写,只有像“姓名”、“国家”等明显的字段。 - Andy E
1
你可能想看看我在这里回答类似问题的答案:https://dev59.com/3nE85IYBdhLWcg3wzm1p#2603408 - Eric Petroelje
2
我为我的隐藏输入框所做的是使用name="address" id="address"等。这使得它成为一个有点明显的字段,同时我也不需要从真实用户那里收集地址。 - Ilja
6个回答

7
您所拥有的东西可能会有助于防止垃圾邮件,但它远非完美解决方案。一个合适的验证码将帮助您更进一步,但根据您的需求和使用情景,您目前的解决方案可能已经足够。

1
我喜欢这个网站,http://caca.zoy.org/wiki/PWNtcha。如果你真的对验证码保护感兴趣,它是一个很好的现实检验。就像Nathan所说的那样,这取决于你的需求,我给他点赞。 - ToddBFisher

5
如果你这样做,我建议使用更好的反垃圾邮件机制。在“名称”属性中输入一个关键词,例如“城市”或“电话”,这可以让反垃圾邮件机器人识别并知道他们可以填写什么样的文本,从而增加成功率。

5

这里是关于编程的内容,ceejayoz这里所说的非常正确。

我喜欢结合其他方法来完成这个操作:

  • 当表单在2秒内提交时,请拒绝请求。
  • 通过ajax进行整个验证 - 这需要启用JavaScript。

首先,在我们的表单字段中添加一个额外的输入:

<input class="not_in_my_house" type="password" name="password">

我将真实密码字段命名为“pass”

添加一些CSS魔法:

.not_in_my_house {
    position: absolute; /* don't bother other elements on the page */
    width: 0; /* small */
    height: 0; /* very small */
    margin: 0; /* tiny */
    padding: 0; /* very tiny */
    border: 0; /* tada */
}

你也可以尝试以下方法,但我觉得这样做不太好 -- 由你决定。

.not_in_my_house {
    position: absolute;
    left: -9999em;
}

最后,每当使用该表单字段提交帖子时,您都会拒绝请求,甚至可能禁止IP。
if(!empty($_POST['password'])){
    echo 'Nope, not in my house.';
}

这种方法的问题在于浏览器的自动填充功能也可能会尝试填写它以帮助用户。 - Philip Attisano
1
@PhilipAttisano 你可以添加 autocomplete="off" - Emre

4
大多数现代垃圾邮件机器人会忽略隐藏字段。

2

还有其他类型的验证码,要求您回答简单的数学问题,或者要求您解决简单的单词谜题。主要目的是区分计算机和人类。因此,您可以尝试许多想法。另一个可能是:向用户显示几个不同颜色的框,并要求他们点击蓝色。它们都具有不同程度的安全性和不同的优缺点,只有您知道自己的情况。


2

一个机器人将填写一个隐藏的字段。但是,您应该使用CSS文件隐藏它,在输入HTML中这样做仍然可以检测到它是否是隐藏字段。


那么在我的情况下,我应用display: none和visibility: hidden,这样可以吗? - Ilja
是的,通过CSS文件来实现可以排除机器人尝试检测隐藏字段的可能性。虽然也可以通过JavaScript来实现,但CSS更加简洁。 - Kevin Vandenborne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接