質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

14510閲覧

Basic認証のかかったページでfile_get_contentsがエラーになる

lenlen

総合スコア44

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/08/30 14:29

編集2017/08/31 10:13

php

1$html = file_get_contents('http://[ID]:[PASS]@[ドメイン]');

BASIC認証のかかったページを上記のようにIDとPASS記述してfile_get_contentsで読み込みたいのですが、下記のエラーが出てしまいます。

php

1Warning: file_get_contents(http://...@[ドメイン]): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in 〇〇... 2

当該ページにはもちろんコンテンツはあります。

basic認証を解いてhtmlソースを読み込みたいのですが、何か手はありますでしょうか...?

【追記】
http://ドメイン/admin/ にログインした状態でないと、http://ドメイン/スラッグ/ の内容が見えない(というよりはapiの結果が見えない)仕組みになっております。これが原因でしょうか。

こういった場合、一旦 http://ドメイン/admin/にログインした状態でhttp://ドメイン/スラッグ/ の内容をfile_get_contentsで取得するということは可能なのでしょうか?

http://ドメイン/admin/ へのログインはbasic認証ではなくdjangoのログインフォームになります。

■サーバー側のallow_url_fopen = On のほうはOnになっておりました。
■digest認証ではなくBasic認証です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/08/30 14:33

basic認証がかかっていないものは取得できますか?
lenlen

2017/08/30 14:38

コメント有難うございます!はい、basic認証がかかっていないコンテンツについては取得することが出来ました。ちなみに取得先のページはdjangoのapiデータページになります。
tanat

2017/08/30 16:46

ブラウザ等、他の方法で認証は可能ですか?
num79kill

2017/08/30 23:38

ブラウザでアクセスして開発ツール(F12)でリクエストヘッダーを質問に追記してください。ドメインとURIはマスクしてください
guest

回答4

0

ベストアンサー

前述のどちらの回答でもBasic認証は可能だと思います。私の開発環境でも確認しました。
とりあえず、Basic認証はブラウザから認証アクセス可能でしょうか?

私が以前にサーバー構築していて異なったBasic認証を重複設定していたため、そもそもアクセスできないのに原因がわからず数時間を無駄にしたことがありました。

下記コマンドでターミナル上から確認します。

bash

1curl -u 'ユーザー名:パスワード' -L 'http://ドメイン'

それからphp.iniallow_url_fopenの値が有効になっている必要があります。

ini

1allow_url_fopen = On

開発環境で試したコードは下記です。
前の方の回答と同じです。

php

1$opts = array( 2 'http' => array( 3 'method' => 'GET', 4 'header' => 'Authorization: Basic '. base64_encode('ユーザー名:パスワード'), 5 ), 6); 7 8echo file_get_contents('http://ドメイン/', false, stream_context_create($opts));

投稿2017/08/31 08:34

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lenlen

2017/08/31 10:07

curl -u 'ユーザー名:パスワード' -L 'http://ドメイン' こちら、ターミナル上で打ってみた所、"detail":"ユーザ名かパスワードが違います。"となりました! そう言えば、http://ドメイン/admin/ にログインした状態でないと、http://ドメイン/スラッグ/ の内容が見えない(というよりはapiの結果が見えない)仕組みになっておりました。これが原因でしょうか。 こういった場合、一旦 http://ドメイン/admin/にログインした状態でhttp://ドメイン/スラッグ/ の内容をfile_get_contentsで取得するということは可能なのでしょうか? 因みにサーバー側のallow_url_fopen = On のほうはOnになっておりました。
Tomak

2017/08/31 10:18

> 一旦 http://ドメイン/admin/にログインした状態でhttp://ドメイン/スラッグ/ の内容をfile_get_contentsで取得するということ これはできなくはないですが、ログインセッションのクッキーを参照したりといろいろ面倒くさいです。 本番環境でこの仕様のプログラムを組まなくてはならないのであれば、ネットワーク構成を見直したほうが良いと思います。
lenlen

2017/08/31 10:25

ご親切にご回答有難うございますm(__)m そうなのですね...。 分かりました!仕様を1から見直してみることにします! 有難うございました。
guest

0

皆様ご回答頂きありがとうございました。
皆様にベストアンサーを付与したい想いですm(__)m

結局は取得される側のサーバー設定の問題でした。管理者権限にログインすることなく内容を表示する設定でbasic認証のみの状態にしてあとは、皆様にご教授頂いたbasic認証を解く方法で行けました!

ありがとうございました。

投稿2017/08/31 13:46

編集2017/08/31 13:48
lenlen

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

【[PHP] file_get_contents で 403 Forbidden | 雪猫ノート】
http://blog.snowcait.info/2016/12/18/php-file_get_contents-403-forbidden/

file_get_contents で 403 Forbidden が出る場合に User Agent を指定すると解決することがあるようです。

このあたりは試されましたか?

投稿2017/08/30 15:09

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lenlen

2017/08/30 16:21

有難うございます。 ユーザーエージェントを色々指定してみましたが、エラーが解消されませんでした。。
lenlen

2017/08/31 10:10

cURLではアクセスすることができませんでした。。 すみません、気づいたことを質問に追記致しました。
guest

0

http

1Authorization: Basic 文字列

というヘッダーを入れることでbasic認証を通過させます。
文字列は ID:パスワードをbase64エンコードしたものです。
文字列 = base64_encode(ID . ':' . パスワード);

php

1<?php 2$opts = array( 3 'http'=>array( 4 'method'=>"GET", 5 'header'=>"Authorization: Basic " . base64_encode("${id}:${password}") 6 ) 7); 8 9$context = stream_context_create($opts); 10 11$file = file_get_contents('http://www.example.com/', false, $context); 12?>

投稿2017/08/30 14:38

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lenlen

2017/08/30 14:52

有難うございます! こちら、試してみたのですが、同様のエラーがでてしまいました。 ちなみに取得先はdjangoを使用したAPIページ(又はjson)になります。
Tak1016

2017/08/30 15:02

本当にベーシック認証ですか? もしかしてDigest認証なんじゃないですか?
lenlen

2017/08/30 16:20

それも一度疑いましたが、しっかりbasic認証なんです...
Tak1016

2017/08/30 16:39

ID/PASSを入力させる認証は BASIC認証とDigest認証の2種類があります。 Basic認証であれば、上記の通りにヘッダーにAuthorizaton: Basic [Base64したID:PASS] をつければ通ります。通らなければID/PASSが間違ってるか、ヘッダーにセットする手続きが間違ってるかのどちらかです。
Tak1016

2017/08/30 16:44

ヘッダーによるID/PASS指定で認証を通すというのがBasic認証のルールなのでやり方が間違っていないか確認してください idが "id" passが"pass"だとしたら "${id}:${password}" この文字列は id:pass という文字列になるはずです。なっていますか? id:passをbase64にした文字列aWQ6cGFzcw==を足して Authorization: Basic aWQ6cGFzcw== という値がきちんとセットされていますか?
lenlen

2017/08/31 00:15

ヘッダーの所ですが、 $opts = array( 'http'=>array( 'method'=>"GET", 'header'=> "Authorization: Basic " . base64_encode("id:pass"), ) ); という形にしております。IDとパスワードは何度も見返したのですが合っている様です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問