2013-04-29 3 views
0

제공 :openssl_pkey_get_details은() 매개 변수 (1) 자원이 될 것으로 예상, 부울 내가 "어딘가"이 스크립트를 발견했습니다

define("ACC_NAME", "my_steam_login"); 
define("ACC_PASS", "my_password"); 
define("GROUP_ID", "my_group_id"); // open steam group page and see "Enterchat room" link, which contains ID 
define("MY_STEAM_ID", "my_steamid"); // steam ID which can invite to join group 

$invite_steam_id = $_GET['i']; 

$ids = file('invited_ids.txt'); 
foreach($ids as $id){ 
    $id = trim($id); 
    if ($id == $invite_steam_id) 
     die($id .": Already invited!\n"); 
} 

function _curl_parse_cookiefile($file){ 
    $aCookies = array(); 
    $aLines = file($file); 
    foreach($aLines as $line){ 
     if('#'==$line{0}) 
      continue; 
     $arr = explode("\t", $line); 
     if(isset($arr[5]) && isset($arr[6])) 
      $aCookies[$arr[5]] = $arr[6]; 
     } 
    return $aCookies; 
} 

function GetFriendID($steam_id) { 
    if (!$steam_id) 
     return 0; 
    $auth = explode(':', $steam_id); 
    if (!$auth[2]) 
     return 0; 
    $fid = $auth[2]; 
    $fid *=2; 
    $fid += 76561197960265728; 
    $fid += $auth[1]; 
    return $fid; 
} 

$mid = GetFriendID(MY_STEAM_ID); 
$fid = GetFriendID($invite_steam_id); 

class RSAHelper{ 
    var $pubkey; 
    public function __construct($modulus, $exponent){ 
     $res = openssl_pkey_get_public($this->buildCertificate($modulus, $exponent)); 
     $details = openssl_pkey_get_details($res); 
     $this->pubkey = $details["key"]; 
    } 

    private function buildCertificate($modulus, $exponent){ 
     $key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB" . "iQKBgQCy745x" . $modulus . "ID" . $exponent; 
     $key = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($key, 16, "\n", true) . "\n-----END PUBLIC KEY-----"; 
     return $key; 
    } 

    public function encrypt($string){ 
     $crypted = ""; 
     openssl_public_encrypt($string, $crypted, $this->pubkey); 
      return base64_encode($crypted); 
     } 
    } 

    $url="https://steamcommunity.com/login/getrsakey/"; 
    $PostFields = array(
     'username' => ACC_NAME 
    ); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_COOKIESESSION, 1); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $PostFields); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
    curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__)."cacert.pem"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    $result=curl_exec($ch); 
    $json=json_decode($result,true); 
    $key_mod=$json['publickey_mod']; 
    $key_exp=$json['publickey_exp']; 
    $timestamp=$json['timestamp']; 

    $RSA=new RSAHelper($key_mod,$key_exp); 

그것은 그룹 증기 초대장을 보내야 오래된 스크립트의 수정 된 버전입니다. 이 버전은 작동하지만 오류가 발생했습니다.

Warning: openssl_pkey_get_details() expects parameter 1 to be resource, boolean given in /home/.../public_html/test/steaminv.php on line 51

이 스크립트의 문제점을 알고있는 사람이 있습니까?

답변

0

오류는 리소스가 아닌 부울 값이 제공되었음을 나타냅니다.

즉, openssl_pkey_get_public 함수는 false를 반환합니다.

제공된 문자열이 유효한 공개 키가 아닌 경우에만 수행됩니다.

클래스의 buildCertificate 메서드가 유효한 PEM 형식 공개 키를 반환하지 않기 때문입니다.

몇 가지 :

  1. 사용 \r\n하지 \n

  2. 사용 chunk_split하지 word_wrap 내가 (만약 내가 잘못 날 수정) 알고있는만큼 멀지 않은

  3. 방법 당신은 공개 키를 만듭니다. Open SSL을 사용하여 키를 작성하십시오.