0

PHP を使用して Microsoft アカウントにログインし、1 つまたは 2 つのアクションを実行しています。これまでのところ、 Microsoft にログインするには、CSRF トークンとして PPFT トークンが必要であることに気付きました。私はこれをやっています:

$PPFT = file_get_contents('http://login.live.com');

preg_match('/id\="i0327" value\="(.*?)"\//', $PPFT, $key);

$ch = curl_init('https://login.live.com/ppsecure/post.srf');
$query = http_build_query(array('login' => 'MY_EMAIL_ADDRESS@gmail.com', 'passwd' => '_MY_EMAIL_ADDRESS_PASSWORD', 'PPFT' => "{$key[1]}"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // for https
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36','Origin: https://login.live.com','Content-Type: application/x-www-form-urlencoded; charset=UTF-8','Referer: https://login.live.com/'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

curl_close($ch);

var_dump($result);

それは私に与えます:

string(512) "HTTP/1.1 200 OK
Cache-Control: max-age=0
Content-Length: 6777
Content-Type: text/html; charset=utf-8
Expires: Fri, 20 Feb 2015 15:33:19 GMT
Server: Microsoft-IIS/8.5
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
X-XSS-Protection: 0
X-Content-Type-Options: nosniff
Set-Cookie: MSPOK=$uuid-49105e9d-c262-4b46-9fa7-710d3058e6fe; domain=login.live.com;secure= ;path=/;HTTPOnly= ;version=1
X-Frame-Options: deny
PPServer: PPV: 30 H: BAYIDSLGN1B021 V: 0
Date: Fri, 20 Feb 2015 15:34:19 GMT
Connection: close

これは確かにOKではありません。

ヘッダーが多いことに不満がある場合は、この画像を参照してください。

jquery (javascript) を使用します。https://login.live.comでこの JavaScript を実行すると、自分のアカウントにログインできます。

x = document.createElement('script');
x.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js';
document.body.appendChild(x);

$.post('https://login.live.com/ppsecure/post.srf', 
{ 
login: 'MY_EMAIL_ADDRESS@gmail.com', 
passwd : 'MY_PASSWORD', 
PPFT : 'Cke!8IRbHV6V95QHkcbjUrMQWetwe7vQchGSnm1*l8NpcMMCeTqAGLZ8xjeFF7NzHJ3enl6ycLRUn0iCgoncbOPyLNPozOq2miY33O0TKGMRZWm70T*7PyslhBIJxvHumMpWH7tbEcIU0HRWs7cgdchinYgQzt85aoktbtrJTTz72Vo5qltscLxChJeOZ73mcg$$' 
}, 
function(data, status, xhr) { console.log(data+"\n"+status+"\n"+xhr.getAllResponseHeaders()); 
});

そして、それはうまくいきます。このスクリーンショットを確認してください:

ここに画像の説明を入力

しかし、PHP では、Microsoft は私が PHP を使用していることを認識しているように見えます。javascript $.post リクエストでログインできますが、PHP ではログインできません。これは、file_get_contents から PPFT トークンを要求し、cURL でデータを POST しているためですか? ただし、cURL の HTML には file_get_contents() と同じトークンがあります。では、何が問題なのですか?

  • 私を助けてください。私は4時間以来、これに打たれています!:(
4

1 に答える 1

1

Curl でリダイレクトが欠落しているようです。jQuery はブラウザーにあるため、自動的にリダイレクトに従います。一方、デフォルトでは Curl はリダイレクトに従いません。

これを PHP curl リクエストに追加して、結果を提供してください

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

ファローアップ。

私はこれをさまざまな方法でやろうとしましたが、うまくいかないようです。ログイン用のページ全体を取得してサーバーに表示し、正しく入力して送信しましたが、ログイン資格情報が正しくないために拒否されました。

私の推測では、Microsoft はリモート クライアントのアドレスをチェックし、送信が実際に Microsoft のログイン Web サーバーから送信されており、どこからでも送信されていないことを確認しています。これは私には非常に理にかなっているように思えます。

上記の私の仮定が正しければ、クローラーのようなものを使用してコンテンツにアクセスする必要があります。私がアクセスするほとんどの Microsoft サイトは JavaScript を多用しています。つまり、JavaScript 対応のクローラーが必要です。それは新しい質問でなければなりません。Make a JavaScript-aware Crawler またはこの Web クローラー Parsing PHP/Javascript links?に関する質問へのリンクを次に示します。

于 2015-02-20T16:07:44.990 に答える