2010-06-02 60 views

回答

0

Google的OpenID(Google Apps for Domains OpenID除外)只是标准的OpenID。您应该采取其他任何OpenID所需的所有预防措施,以确保断言是合法的。你是对的......任何人都可以编写一个OpenID肯定的断言来欺骗你的RP,除非你的RP验证了签名,在标识符上执行发现并将该标识符的授权OP端点与签名响应的标识符进行匹配。

至于你是否可以信任电子邮件地址,这取决于你。您可以选择信任Google OP终端,然后您知道。

-1
function ValidateWithServer(){ 
    $params = array(
     'openid.assoc_handle' => urlencode($_REQUEST['openid_assoc_handle']), 
     'openid.signed' => urlencode($_REQUEST['openid_signed']), 
     'openid.sig' => urlencode($_REQUEST['openid_sig']) 
    ); 
    // Send only required parameters to confirm validity 
    $arr_signed = explode(",",str_replace('sreg.','sreg_',$_REQUEST['openid_signed'])); 
    for ($i=0; $i<count($arr_signed); $i++){ 
     $s = str_replace('sreg_','sreg.', $arr_signed[$i]); 
     $c = $_REQUEST['openid_' . $arr_signed[$i]]; 
     // if ($c != ""){ 
      $params['openid.' . $s] = urlencode($c); 
     // } 
    } 
    $params['openid.mode'] = "check_authentication"; 

    $openid_server = $this->GetOpenIDServer(); 
    if ($openid_server == false){ 
     return false; 
    } 
    $response = $this->CURL_Request($openid_server,'POST',$params); 
    $data = $this->splitResponse($response); 

    if ($data['is_valid'] == "true") { 
     return true; 
    }else{ 
     return false; 
    } 
} 
+0

您不应该依赖$ _GET,因为响应数据可能在$ _POST中。 – AlBeebe 2011-03-14 13:49:48

1
public function verify_response() 
     {$params=$_REQUEST; 
     $query=array('openid.signed'=>$params['openid.signed'], 
        'openid.sig'=>$params['openid.sig'], 
        'openid.mode'=>'check_authentication' 
        ); 
     $keys=explode(',', 'openid.'.strtr($params['openid.signed'], array(','=>',openid.'))); 
     foreach ($params as $k=>$v) 
       {if (in_array($k, $keys)) 
        {$query[$k]=$v; 
        } 
       } 
     $query=http_build_query($query); 
     $response=file_get_contents($params['openid.op_endpoint'].'?'.$query); 
     return stripos($response, 'is_valid:true')!==false; 
     }