1

こんにちは、Paypal APIを使用する代わりに、phpとcurlを使用してWebページを設計し、特定の電子メールがPaypalで検証されているかどうかを確認しました。そのためには、スクリプトがPaypalのWebサイトにログインできるようにする必要があります。現在、私は電子メールが確認されているかどうかを確認するためだけに偽のペイパルアカウントを使用していますが、私の質問は、ペイパルのWebサイトに入力されているユーザー名とパスワードがどれほど安全かということです。それが安全でなく、サーバー通信を監視している誰かによって簡単に盗聴される可能性がある場合、どうすればそれから保護できますか?

私はPaypalのAPIを使用していないことに注意してください。これは、Webサイトに組み込むのに非常に多くの作業が必要であり、電子メールが確認された場合に返すために追加のフィールド(名、姓など)が必要になるためです。

コードは次のとおりです。

<?php
//email address to check
$verifyEmail = 'randomemail@blah.com';

//paypal login info
$loginEmail = '###';
$password = '###';

if (!isLogin($loginEmail, $password)) {
    echo 'Login failed';
} else if (isVerified($verifyEmail)) {
    echo 'Verified';
} else {
    echo 'Not verified';
}


#########################################
function isVerified($verifyEmail) {
    $url = 'https://www.paypal.com/us/verified/pal='.$verifyEmail;
    $response = curl_get($url);
    if(strpos($response, '<td class="emphasis">Verified</td>')) {
        return true;
    } else {
        return false;
    }
}

function isLogin($email, $password) {
    // Get login page 
    $response = curl_get('https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-run');
    $postFields = getHiddenFormInputs($response, 'login_form');
    if (!$postFields) {
        return false;
    }
    // Post login
    $postFields['login_email'] = $email;
    $postFields['login_password'] = $password;
    $postFields = serializePostFields($postFields);
    $response = curl_get('https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-submit', $postFields);
    if(!strpos($response, 'login_cmd=_login-done')) {
        return false;
    } else {
        return true;
    }
}

function curl_get($url, $postfields=false) {
    static $curl;
    if(empty($curl)) {
        $cookiejar = 'curl_cookiejar.txt';
        @unlink($cookiejar);
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_COOKIEJAR,  $cookiejar);
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiejar);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLOPT_MAXREDIRS, 5);

    }
    curl_setopt($curl, CURLOPT_URL, $url);
    if(stripos($url, 'https')!==false) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); 
    }
    if ($postfields) {
        curl_setopt($curl, CURLOPT_POST, 1);    
        curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
    }
    $response = curl_exec($curl);
    return $response;
}

function getHiddenFormInputs($html) {
    if(!preg_match('|<form[^>]+login_form[^>]+>.*</form>|Usi', $html, $form)) {
        return '';
    }
    if(!preg_match_all('/<input[^>]+hidden[^>]*>/i', $form[0], $inputs)) {
        return '';
    }
    $hiddenInputs = array();
    foreach($inputs[0] as $input){
        if (preg_match('|name\s*=\s*[\'"]([^\'"]+)[\'"]|i', $input, $name)) {
            $hiddenInputs[$name[1]] = '';
            if (preg_match('|value\s*=\s*[\'"]([^\'"]*)[\'"]|i', $input, $value)) {
                $hiddenInputs[$name[1]] = $value[1];
            }
        }
    }
    return $hiddenInputs;
}

function serializePostFields($postFields) {
    foreach($postFields as $key => $value) {
        $value = urlencode($value);
        $postFields[$key] = "$key=$value";
    }
    $postFields = implode($postFields, '&');
    return $postFields;
}


?>
4

3 に答える 3

4

使用されているメソッドを無視すると(APIはより堅牢であり、ログインを変更すると現在のメソッドが機能しなくなる可能性があります)、CURLはブラウザーからの標準的なリクエストと同じくらい安全です。スクリプトから、リクエストにhttpsを使用していることがわかりますので、問題ないはずです。

于 2012-10-11T13:32:50.187 に答える
2

cURLInternetExplorerやGoogleChromeほど安全ではありません。

于 2012-10-11T13:31:46.820 に答える
2

Curlリクエストは、ブラウザでサイトにアクセスするのと同じくらい「安全」ですが、CURLOPT_SSL_VERIFYPEERオプションをtrueに設定し、CURLでHTTPSを使用する場合は、CURLOPT_CAINFOを使用して証明書をカールするように指定する必要があります。

curl_setoptのドキュメントを確認してください。

于 2012-10-11T13:59:27.580 に答える