2010-12-08 198 views
1

我试图找出sanatize和验证reCAPTCHA密钥的最佳方法。问题是我没有很多关于他们如何形成钥匙的信息。我认为最好的方法可能是检查字符串是否长40字,并且包含字母,数字,破折号和下划线。这里是我从文件中获得的信息。验证reCAPTCHA密钥

invalid-site-public-key:你有没有确保复制整个键,连字符和下划线,但没有任何空格?关键应该是正好40个字母。 Source

我的公钥看起来像这样6Ler570SAAAAAOfjh3CNFPtuBSH_QdavHc5x_JUv我只是担心编写验证是过于严格,不会让一些人使用我写的插件。

这就是我现在使用的,但不知道是否有更好的方法。

if($recaptcha_public_key) { 
    //validate the key 
     $recaptcha_public_key = filter_var($recaptcha_public_key, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/[0-9a-zA-Z_-]{40}/"))); 
    // Update value in database 
    update_option('recaptcha_public_key', $recaptcha_public_key); 
} 

谢谢!

回答

1

你有什么("/[0-9a-zA-Z_-]{40}/")是一样严格,你会得到。关键点在于它是随机的 - 如果符合严格的格式化规则,就很容易被破解。

没有分析一组公钥,公平地假设每个字符在集合[0-9a-zA-Z_-]内是完全随机的。即使这是假设是不正确的,并且存在一些更具体的模式,但在将来的某个时刻这可能会发生变化,因此将应用程序提交到当前模式并不是一个好主意。

2

你为什么要自己验证它?你没有在数据库中输入信息或在页面上显示它吗?如果你把它放在页面的html编码上,那应该防止脚本形式被运行。

您应该使用http://www.google.com/recaptcha/api/verify将它发送给第三方并验证它(因为它在http://code.google.com/apis/recaptcha/docs/verify.html中声明)。

+0

我为YOURLS和管理页面创建插件我有用户输入他们的私钥和公钥,这些私钥和公钥都存储在数据库中,直到我需要检索密钥才能验证验证码。 – BandonRandon 2010-12-09 22:53:19

0

这似乎是完美的

if(preg_match('#^6[0-9a-zA-Z_-]{39}$#', $key)){ 
    // Valid key 
} 

这些键的当前状况:

  • 40个字符
  • 开始以 “6”
  • 只有字母数字,下划线和dash characters
+0

感谢您的回答。然而,关键并不总是以6开头,这只是一个例子。 虽然我明白你的回答主要是围绕正则表达式验证,但我确实想提到这个问题现在已经6岁了,Google/reCAPCHA不再使用[Secret Token Validation](https://developers.google.com/recaptcha) /文档/ secure_token)。相反,他们正在使用[域名验证](https://developers.google.com/recaptcha/docs/domain_validation) – BandonRandon 2016-11-18 20:54:51