我们在注册表单中使用Captcha控件,我们在服务器验证旁边对JavaScript(JQuery)中的所有字段进行完全客户端验证。
我尝试了很多方法,但所有人都会在JavaScript中编写Captcha值,任何人都可以访问:(
我搜索是否有任何方法允许我以安全的方式使用JQuery在客户端验证Captcha值,或者无法完成?
答案 0 :(得分:8)
无法完成。
正如您所知,Javascript是客户端的,并且任何代码客户端都必须被视为可能受到损害,因为您无法控制它。
最好的情况是,您可以使用盐来发送值的盐渍哈希,但即使这样也可以用来在实际提交之前测试猜测值。
其他所有内容都依赖于对服务器的调用。
根据评论请求,这是一般性的想法:
首先,在服务器上,计算要用作盐的随机字符串。这应该是每个请求大致唯一。此字符串的目的是阻止rainbow table attacks。
现在,单独保存此字符串,还要创建另一个字符串,该字符串是随机字符串和Captcha答案的串联。在这个新的组合字符串中,您可以生成它的哈希值(例如,SHA-1)。
using System.Web.Security;
...
string hashVal = FormsAuthentication.HashPasswordForStoringInConfigFile(combined, "SHA1");
随机字符串和哈希值都需要放在页面中,以便javascript能够阅读。
在客户端,当用户回答Captcha时,取随机字符串并将其与答案连接(在这里得到想法?)。使用此字符串,您可以使用SHA-1 JQuery plugin之类的内容对其进行哈希处理,并将其与您发送的预先计算的哈希值进行比较。
hashVal = $.sha1(combinedString)
如果匹配,则(几乎)肯定是正确的答案。如果没有,那么它是100%的错误答案。
答案 1 :(得分:1)
您可以使用ajax将当前值发布到服务器,这将响应true或false。这将使你不能做一个真正的帖子,也不会在html中赠送catpcha的值。
答案 2 :(得分:0)
我的解决方案))每当页面向用户显示验证码时,您都可以动态生成混淆的JavaScript函数(我认为最佳方式5或10 )。 例如,一个函数(或3)))可以使用预生成的哈希值设置cookie(服务器返回它)(来自验证码的实际值),其他函数必须实现服务器端算法来检查用户键入的值。我可以说它适用于100%,因为很难动态解析javascript +我们在客户端设置用户cookie(Bots's很难找到你设置和检查cookie的位置和方式),使用JavaScript