

PHP超初心者です。

標記のとおりなのですが、パスワード認証がついた外部サイトにアクセスし、ログイン後の画面をechoさせるプログラムを作ろうとしております。

file_get_contentsを使って、次のようにPOSTリクエストを送っているのですが、何度試みても、echoの結果がログイン前の画面になってしまい（おそらく、ログインの失敗によるリダイレクトかと思われますが、リクエスト対象が外部サイトなので、受信サーバ側の正確な処理は不明です）、うまくログインできません。  
実行環境はローカルのApacheです。

[code]

    <?php
    
    $data = array(  
    "ユーザーIDのname属性" => "ユーザーID",
    "パスワードのname属性" => "パスワード"
    );
    $data = http_build_query($data, "", "&");
    
    //header
    $header = array(
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: ".strlen($data),
    "User-Agent: ユーザーエージェントの指定"
    );
    
    $context = array(
    "http" => array(
        "method"  => "POST",
        "header"  => implode("\r\n", $header),
        "content" => $data
    )
    );
    
    $url = "認証用ファイルが置いてある外部サイトのURL";
    echo file_get_contents($url, false, stream_context_create($context));
    
    ?>
    
[/code]

尚、PHPを使わず、HTMLのFormタグとJavascriptの組み合わせ（Formタグに予めPOSTデータを仕込んでおき、Javascriptに自動でSubmitさせる方法）であればうまくいきますが、今回は、PHPで実装することを目標としています。

ブラウザからのリクエストと、サーバからのリクエストで、HTTPリクエストヘッダが違うことが原因かとも思ったのですが、自己解決できず、質問させていただくに至りました。

そもそも、この方法（file_get_contentsを用いたPOSTリクエスト）で外部サイトの認証は突破できますでしょうか？

お詳しい方のご意見をお待ちしております。


CC BY-SA 3.0
2016-08-31T15:10:05.450
28611
2017-08-02T11:06:37.047
18661
question
php
PHPでパスワード認証がある外部サイトに自動でログインしたい


逆説的な回答になってしまいますが、外部サイト側からの視点でみると,  
ご質問にある「自動ログイン」を行うようなリクエストが自身のサイト以外からリクエストされた場合、まず悪意のある攻撃者として処理するのが懸命でしょう。（すくなくとも私は絶対にログインさせません。）

理由としては、例えばログイン後にそのユーザーの個人情報（住所・クレジットカード番号等）を表示するようなシステムの場合、悪意のある外部のサイト運営者に、レスポンスを介してその情報が渡ってしまう可能性があるからです。

このような脆弱性または、悪意のある攻撃のことをCSRF(クロスサイトリクエストフォージェリ)と言います。  
なので、通常はログインを行うサイト側で「ログインリクエストはどこからリクエストされたか」をチェックして、自身のサイトからのリクエストのみパスするような対策を行っています。

しかし、ご質問にあるような「HTMLタグとjavascriptならうまく行く」ということなので、CSRF対策を行っていないサイトなのかもしれません。ですが、通常はこのようなリクエストも悪意のある可能性があるのでログインさせないのが懸命です。

明確な回答ではなく申し訳ないのですが参考までに。  
（ソース: <http://www.trendmicro.co.jp/jp/security-intelligence/threat-
solution/csrf/index.html>）


CC BY-SA 3.0
2016-09-16T14:35:24.813
28933
2016-09-16T14:35:24.813
13097
28611
answer


フォームを使ってログインするサイトの場合、たいていの場合cookieでセッション管理していますので、cookieを適切に取り扱う必要があります。PHPの`file_get_contents`はcookie管理機能を持っていないように思われますので、自分でレスポンスヘッダからcookieを取り出したり、リクエストヘッダにcookieをつけてあげる必要があるでしょう。

また、いきなり認証情報をPOSTしていますが、ログインフォームが表示されている画面でセッションを開始してあげないといけないかもしれません。

後はリクエスト/レスポンスをブラウザでやる場合とプログラムでやった場合で見比べて差を見つけていくしかありません。


CC BY-SA 3.0
2017-05-26T01:07:21.660
35021
2017-05-26T01:07:21.660
5793
28611
answer