【问题标题】:Can I read Captcha data from JavaScript in a secure way?我可以以安全的方式从 JavaScript 读取验证码数据吗?
【发布时间】:2011-02-28 07:54:26
【问题描述】:

我们在注册表中使用 Captcha 控件,除了服务器验证之外,我们对 JavaScript (JQuery) 中的所有字段进行完整的客户端验证..
我尝试了很多方法,但都将在 JavaScript 中编写任何人都可以访问的 Captcha 值:(
我搜索是否有任何方法可以让我在客户端使用 JQuery 以安全的方式验证验证码值,或者无法完成?

【问题讨论】:

    标签: asp.net javascript jquery captcha


    【解决方案1】:

    我的解决方案)) 每次页面向用户显示验证码时,您都可以动态生成混淆的 JavaScript 函数(我认为最好的方法是 5 或 10)。 例如,一个函数(或 3)))可以使用预先生成的哈希设置 cookie(服务器返回它)(来自验证码的真实值),其他函数必须实现服务器端算法来检查用户输入的值。我可以说它 100% 有效,因为很难动态解析 javascript + 我们在客户端设置用户 cookie(Bots 很难找出你在哪里以及如何设置和检查 cookie),通过使用 JavaScript .

    【讨论】:

    • 抱歉 Saff ,但您能否详细解释一下您的解决方案
    • 你有用于验证码的服务器端简单哈希: md5(captcha_srv_side) 我们需要将此哈希与客户端哈希匹配。最简单的方法是将我们的哈希分成两部分,然后通过服务器端将其写入用户 cookie ({"v1":"81b..","v2":"873f..."})。现在我们在用户 cookie 中有 2 个变量。我们可以使用javascript的很多函数编写非常复杂的代码,然后混淆这段代码。当用户输入验证码时,脚本会运行js事件函数,concat 2 vars(v1,v2),从用户字符串生成md5,写入cookie,然后匹配它们。这只是一个小例子。有很多变化。
    【解决方案2】:

    做不到。

    如您所知,Javascript 是客户端,任何代码客户端都必须被视为可能受到威胁,因为您无法控制它。

    充其量,您可以将值的加盐哈希与盐一起发送,但即使它本身也可用于在实际提交之前测试猜测值。

    其他一切都依赖于对服务器的调用。


    根据评论请求,大致思路如下:

    首先,在服务器上,计算一个随机字符串作为盐。这应该是每个请求大致唯一的。这个字符串的目的是防止rainbow table attacks。

    现在,单独保存这个字符串,但还要创建另一个字符串,它是随机字符串和验证码答案的连接。在这个新的组合字符串中,您生成它的哈希值(例如,SHA-1)。

    using System.Web.Security;
    ...
    string hashVal = FormsAuthentication.HashPasswordForStoringInConfigFile(combined, "SHA1");
    

    随机字符串和哈希值都需要放在页面中,以便javascript能够读取。

    在客户端,当用户回答验证码时,获取随机字符串并将其与答案连接(在这里得到想法?)。使用此字符串,您可以使用类似SHA-1 JQuery plugin 的方式对其进行哈希处理,并将其与您发送的预先计算的哈希值进行比较。

    hashVal = $.sha1(combinedString)

    如果匹配,它(几乎)肯定是正确答案。如果不是,那么它是 100% 错误的答案。

    【讨论】:

    • Dan,你能给我举个“salted hash solution”的例子吗?
    • 实际上您可以使用散列来不暴露验证码值,但仍然启用客户端验证。这当然只适用于响应式 UI,也必须在服务器上进行检查。
    • 通过揭示哈希值,攻击者可以在不将其发送到服务器的情况下进行多次猜测。此外,如果它不能得到正确的猜测,它可以刷新页面。这可以使攻击者以更低的检测率获得更好的打击率。
    • @Dykam 如果在验证码屏幕中获得的收益是“仅用于响应式 UI”,那么揭示任何可以帮助攻击者的东西似乎对另一方面来说太重要了
    • 如果你使用一些 sha 散列方法,黑客最好使用验证码破解器,因为彩虹表对 sha 不太有用,因为这两个表都会很大。
    【解决方案3】:

    您可以使用 ajax 将当前值发布到服务器,服务器会响应 true 或 false。这将使您无法发布真正的帖子,也无法在 html 中泄露 catpcha 的价值。

    【讨论】:

    • 不幸的是,我们不会使用 ajax 以隐藏的方式进行服务器验证,所以我们在 JQuery 中搜索其他一些解决方案..
    • 我想我必须同意丹的观点。如果不在您的脚本或 html 中公开答案,则没有合理的方法可以做到这一点。
    • 单用JQuery是没有办法的。只有服务器访问才能让您高枕无忧。
    猜你喜欢
    • 2020-06-30
    • 2011-04-12
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2020-02-25
    • 2020-12-30
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多