【问题标题】:How I can check if a string is likely to be generated by a bot?如何检查字符串是否可能由机器人生成?
【发布时间】:2019-10-18 09:23:12
【问题描述】:

我有垃圾邮件问题。一些机器人(我相信)正在绕过 Google recaptcha 并将如下字符串插入到我网站上的表单中:

dtbNPRpfcz

VvAJEXqueSKscY

有谁知道我可以使用的任何 JS 或 C# 代码很可能表明上述字符串是随机生成的?

如果我可以检查正在填写的字段并知道其中有几个可能是机器人生成的,那么我可以阻止提交。

例如,上面的字符串似乎有超过正常数量的 ucase 字符。

更新:目前正在考虑对某些字符串使用密码强度检查器。如果字符串高于弱,那么它很可能是垃圾邮件。我的网络主机说“尝试另一个 recaptcha”。

更新:

嗯。我在这方面学到了很多东西并获得了一些有用的代码,所以非常感谢您的输入和回答。然而,在忽略了周末的问题后,我又看了一遍。我注意到垃圾邮件机器人正在绕过所有的表单验证。然后一分钱掉了。该机器人将直接路由并发布到它。我没有设置 CSRF(跨站点请求伪造)。这意味着代理可以从站点域外部发布到 url。呵呵!

我已将此添加到表单中:

 @Html.AntiForgeryToken()

但我的一些路线缺少检查它的代码:

  try
            {
                this.ValidateCsrfToken();
            }
            catch (CsrfValidationException)
            {
                return Response.AsText("Csrf Token not 
valid.").WithStatusCode(403);
            }

所以。为浪费您的时间而道歉。这立即修复了它。

【问题讨论】:

  • 对于这种网站格式来说,这是一个相当广泛的主题。此外,它几乎是在乞求外部工具,这是题外话(见help center
  • 如果我们坚持你的例子,与字典的简单比较(加上或减去一些模糊的变化)应该可以解决问题。但我怀疑你想要更复杂。此外,它还取决于您的性能要求。
  • 另外,为了直接与您的问题相关,您是否尝试计算字符串中的大写字母?
  • 页面应该发送什么?某种人类语言的合理文本?你确定这个机器人,或者它是什么,正在使用包含 Re-Captcha 的页面,还是直接从服务器发送请求?
  • 我知道,如果您发送一封带有站点链接的电子邮件,并且您有一个表单(带有或不带有 recaptcha),Microsoft 的 Outlook 可能会尝试使用该链接提交表单,还有一个随机字符串。您仍然需要检查 recaptcha 挑战是否成功,因为机器人(通常)不会通过我认为的挑战。我不是这方面的专家,但我记得我们有一个场景,我们的服务器由于 API 中的一些随机字符串而记录了错误,并且是 Microsoft 为使用 Outlook 的用户自动完成的。

标签: javascript c# string random bots


【解决方案1】:

随机字符串检测很复杂,与机器学习有关。我不建议您自己实现它,也许拼写检查 JS/C# 库会有所帮助。

除此之外,关于bot预防,我尝试提出一些建议:

  • 确保您已正确实施 Google recaptcha。 如果可能,请使用 reCAPTCHA v3,并确保您已在后端验证 g-recaptcha-response。 Google recaptcha 不是 100% 可靠的,可以被一些 Anti Captcha 解决方案绕过,但正确的实施是基本的。

  • 过滤掉可疑的 IP 地址。阻止发送随机生成字符串的 IP 地址。

【讨论】:

  • 我把它作为答案,因为它让我检查了一切。
【解决方案2】:

带有 .js 扩展名的随机 16-40 个随机字符名称脚本,您可以在其中查看以下格式的信息,例如 userAgentKey、timezoneKey、browserKey。您可以使用 XHR 和 JS 信息在 Sources 选项卡或 Network 选项卡中检查脚本。 您可以创建正则表达式来获取与文件信息匹配的所需脚本信息。 [A-Za-z0-9]{14,40}.js 例如:ytpbsalvddssjopc.js

interrogate: function(e) {
                var t = {};
                t = this.userAgentKey(t),
                t = this.languageKey(t),
                t = this.screenKey(t),
                t = this.timezoneKey(t),
                t = this.indexedDbKey(t),
                t = this.addBehaviorKey(t),
                t = this.openDatabaseKey(t),
                t = this.cpuClassKey(t),
                t = this.platformKey(t),
                t = this.doNotTrackKey(t),
                t = this.pluginsKey(t),
                t = this.canvasKey(t),
                t = this.webglKey(t),
                t = this.touchSupportKey(t),
                t = this.videoKey(t),
                t = this.audioKey(t),
                t = this.vendorKey(t),
                t = this.productKey(t),
                t = this.productSubKey(t),
                t = this.browserKey(t),
                t = this.windowKey(t),
                t = this.locationKey(t),
                t.fonts = "",
                t.devices = null,
                this.keys = t,
                this.parallel([this.fontsKey, this.devicesKey], e)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2021-10-31
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多