验证reCAPTCHA密钥

时间:2010-12-08 22:40:20

标签: php regex captcha recaptcha

我正在试图找出最好的方法来对aCAPTCHA密钥进行整理和验证。问题是我没有很多关于它们如何形成键的信息。我认为最好的方法可能只是检查字符串是40个字符串长,包含字母,数字,短划线和下划线。这是我从documntations获得的信息。

  

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 );
}

谢谢!

3 个答案:

答案 0 :(得分:2)

你为什么要亲自验证?您没有使用这些信息访问您的数据库,或者您是否在页面上显示它?如果你把它放在页面上html编码它,这应该可以防止脚本形式运行。

您应该使用http://www.google.com/recaptcha/api/verify将其发送给第三方,并对其进行验证(如http://code.google.com/apis/recaptcha/docs/verify.html中所述)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这似乎是完美的

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

以下是按键的当前条件:

  • 40个字符
  • 以" 6"
  • 开头
  • 仅限字母数字,下划线和短划线 字符