【问题标题】:addeventlistener for 'keypress' = captcha alternative?addeventlistener for 'keypress' = 验证码替代方案?
【发布时间】:2010-11-10 09:33:13
【问题描述】:

我是否认为垃圾邮件机器人无法模拟“按键”事件,因此如果我在提交联系表单中的每个字段之前都需要按键,我就不会收到垃圾邮件?

如果我不在乎我的观众是否启用了 JavaScript,这是否是验证码等的一个很好的替代品?

巫师们,让我正确。

【问题讨论】:

    标签: javascript validation captcha addeventlistener


    【解决方案1】:

    我不确定他们是否可以“本机”生成按键事件(我认为您可能是对的,他们不能,但得知有一些边缘情况是可能的,我不会感到惊讶)。

    但是,我认为他们只直接执行element.onkeypress() 不会有问题。如果 bot 可以确定它需要按下一个键来前进,那么实际上归结为需要调用特定的事件处理程序方法 - 而 bot 可以 执行后者。它也可以创建自己的包含 keycode 的虚假 Event 对象,然后将其传入和/或将其设置为 window.event

    理论上,您可能能够通过非常严格地自省处理程序中的事件对象来检测到这一点。我不认为机器人能够轻易地创建一个本地等效的事件对象,所以也许通过检查原型链你可以区分两者。但是,这对于一般用途来说几乎肯定是太脆弱了,并且不会在不同的浏览器/环境/插件/等中可靠地工作。

    因此,我不认为这是一条富有成效的道路,因为您无法在事件处理程序中判断该事件是否“真实”。浏览器原生代码不同,因为机器人实际上无法触发点击事件,但在 Javascript 中,我没有看到一种简单的方法来阻止您的方法被简单地调用。

    【讨论】:

    • 当你说机器人不能触发点击事件时,你的意思是使用onClick按钮而不是提交按钮会让我安全吗?
    • 我的意思是(IE 除外)无法在 Javascript 中模拟 实际 点击事件。当然,您可以尝试弄清楚效果会是什么并让它们发生(例如,获取链接的href 元素并导航到它)。但是你不能说“嘿,浏览器,我刚刚点击了这里——现在就采取适当的行动”。所以回答你的问题,可能不是;机器人可以手动运行button.onClick()
    • @AndrzejDoyle mousemove 怎么样?
    • @Shane 我的回答中的一切都同样适用于 any 原生 JS 事件/监听器。它仍然只是函数 - 调用 element.onmousemove() 并不比调用 element.onkeypress() 更具挑战性。
    • @AndrzejDoyle 你的权利。在过去的几天里,我了解到这些机器人的脚本是在最近的一个站点上测试后使用它的。
    【解决方案2】:

    垃圾邮件机器人的当前实现可能无法做到这一点。但是模拟按键并不难。如果您只是一个小型网站,机器人作者可能不会做任何工作来绕过您的系统,但如果它大到足以让作者关心您的系统,那么您的系统将很快被破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多