卷曲功能被嗅到的安全性如何?

时间:2012-10-11 13:27:48

标签: php curl

您好,而不是使用Paypal API,我设计了一个使用PHP和curl的网页来检查是否在Paypal上验证了某个电子邮件。为了做到这一点,我必须允许脚本在Paypal的网站上为我登录。现在我使用假的paypal帐户只是为了检查电子邮件是否经过验证,但我的问题是在paypal的网站上输入的用户名和密码的安全性。如果它不安全并且可以被监视服务器通信的人轻易嗅出,我该如何防范?

请注意我没有使用Paypal的API,因为它需要太多工作才能合并到您的网站上,并且如果验证了电子邮件(名字,姓氏等),则需要额外的字段才能返回。

以下是代码:

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


?>

3 个答案:

答案 0 :(得分:2)

忽略正在使用的方法(API更健壮,当前方法可能会在更改登录时中断),CURL与浏览器的任何标准请求一样安全。从脚本中我可以看到你正在使用https来处理请求,所以你应该没问题。

答案 1 :(得分:1)

cURL不比Internet Explorer或Google Chrome更安全或更不安全。

答案 2 :(得分:1)

使用浏览器访问网站时,卷曲请求将“安全”,但您应将CURLOPT_SSL_VERIFYPEER选项设置为true,并在使用带有CURL的HTTPS时使用CURLOPT_CAINFO指向卷曲到证书。

检查curl_setopt documentation