0

保護する必要のあるファイルを含むディレクトリがあります。保護は、標準の HTTP 基本認証 (.htaccess、.htpasswd など) によって行われます。以下のコードを使用すると、保護されたページのコンテンツを取得できますが、他には何もありません (「セッション/ログイン」はすぐに期限切れになります)。そのページにアクセスしてファイルをダウンロードする必要があります。保護された領域にログインし、php (または javascript/ajax) を使用してそのページにとどまるにはどうすればよいですか?

<?php 
// HTTP authentication 
$url = "http://localhost/protected_files/"; 
$ch = curl_init();     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_USERPWD, "login:password");  
$result = curl_exec($ch);  
curl_close($ch);  
echo $result; 
?> 

jQuery ajaxを使用して同じ:

var username = $("input#username").val();
var password = $("input#password").val();  

function make_base_auth(user, password) {
  var hash = btoa(user + ':' + password);
  return "Basic " + hash;
}

$.ajax
  ({
    type: "GET",
    url: "http://localhost/protected_files/",
    headers: {
       'Authorization' : make_base_auth(username, password)
    },
    success: function (data){
      $('body').html(data);
    }
});
4

1 に答える 1

4

PHPスクリプトは、CURLを使用して、HTTP基本認証で保護されているディレクトリにあるファイルを読み取り、画面にエコーします。PHPがWebルートにあり、保護されたディレクトリが「protected」というサブディレクトリにある場合、ユーザーのブラウザが実際に保護されたディレクトリにリダイレクトされることはありません。ユーザーのブラウザはWebルートにとどまります。

さらに、ユーザーのブラウザが認証されたことはありません。PHPスクリプトを介して認証されたのはWebサーバーのみです。このように考えると、Webサーバーは人間として機能し、PHPベースのWebブラウザを使用して認証を行いました。自宅のコンピューターの前に座っている人は、Webブラウザーを認証していません。Apacheは認証され、そのファイルの内容を読み取り、一種のプロキシとしてエンドユーザーに渡しました。

最初のスクリプトがページをロードした後。「保護された」フォルダ内にあるファイルを指すhref属性を持つアンカータグは、ユーザーに認証を求めるポップアップを表示します。これを期限切れのセッションと間違えています。これは、PHPスクリプトをホストしているサーバー(エンドユーザーのコンピューターではない)がPHPスクリプトで認証されているために発生します。エンドユーザーのコンピューターは、まだ一度も認証されていません。クレデンシャルを入力した後は、セッションの残りの部分で問題がないはずです。

あなたが求めていることは不可能です。ユーザーは、リンクをクリックするたびに、常にユーザー名とパスワードの入力を求められます。なぜ彼らにログインさせないのですか?ファイルをパスワードで保護する必要がある場合、なぜ保護を回避しているのですか。あなたはあなたのアプローチを再考する必要があるかもしれません。

さらに詳しく:これはPHPスクリプトです。

  • エンドユーザー:ねえ、私はちょうどあなたにサーフィンをしました
  • Apache:すばらしい、保護されたディレクトリからファイルを取得するこのphpスクリプトを実行させてください
  • PHP:わかりました。ファイルを取得させてください。ねえ、Apache、私はあなたのフォルダからhttpd基本認証を使用してファイルを取得するように指示されました!
  • Apache:奇妙な!わかった。ログインとパスワードは何ですか。あなたがその情報を持っていない限り、私はあなたにファイルを与えることができません。
  • PHP:その情報をハードコーディングしています。どうぞ。
  • Apache:ありがとう!これがそのファイルです。
  • PHP:すばらしい。ファイルをありがとう!さて、それをエンドユーザーに返すことができますか。どうぞ。すぐに戻って。
  • Apache:ありがとう!私はそのファイルを持っています。ここでエンドユーザーに行きます。
  • エンドユーザー:うわー、ファイルが表示されます!ApacheとPHPに感謝します!

ここで、エンドユーザーはリンクをクリックしてファイルをダウンロードします

  • エンドユーザー:ねえ、今すぐそのファイルをダウンロードしたい。
  • Apache:わかりました。ログインとパスワードは何ですか。
  • エンドユーザー:HEY!私はそれを必要としません。私はあなたにそれを与えただけではありませんか?
  • Apache:いいえ。PHPはあなたのためにそのファイルを入手し、あなたにコピーを与えるように私に言いました。あなたは実際に私の門を通過したことがありません。それで、パスワードは何ですか!
  • エンドユーザー:スタックオーバーフローのMrbinky3000に取引内容を聞いてみましょう。

これがJavaScriptの例での会話です。

  • エンドユーザー:ねえ、ブラウザさん、このURLにアクセスしてください。
  • ブラウザ氏:Apacheさん、このURLのページを取得していただけませんか。
  • Apache:さあ、ブラウザさん。ページをお楽しみください。
  • ブラウザ氏:ああ、Javascript氏のためのコードがここにあるようです。

エンドユーザーはユーザー名とパスワードを入力し、送信ボタンをクリックします

  • ブラウザ氏:わかりました。JavaScriptを実行する時間です。さあ、Javascriptさん。
  • JavaScript氏:ねえ、Apache!このページをサブフォルダから取得して、ブラウザさんの本文に表示するように言われました。唯一のことは、そのサブフォルダは基本認証で保護されているということです。だから私はあなたにこれらの資格を与える必要があります。
  • Apache:ねえ。JavaScriptさんどうしたの。保護されたディレクトリからこのページを取得してほしいとのことです。私はそれをやりたいのです、私たちは友達です、しかし私はあなたにこれを尋ねる必要があります:ログインとパスワードは何ですか。個人的なことは何もありません、それは私の仕事です。
  • JavaScript氏:問題ありませんApache!私は資格を持っています。どうぞ。
  • Apache:すばらしい!ここに行き、そのページを取得します。これがそのページです。楽しむ。
  • JavaScript氏:Apacheさん、そのファイルを取得していただきありがとうございます。ねえ、ブラウザさん、私はあなたの体の内容をApacheがちょうど私にくれたファイルと交換する必要があります。
  • ブラウザ氏:もちろん、問題ありません。あなたからそれを取らせてください。そして、ここに、あなたがフェッチしたそのページが私の体になりました。
  • エンドユーザー:うわー、ブラウザさん、ありがとうございます。保護されたページが表示されます。リンクをクリックする時間です。

エンドユーザーがリンクをクリックします。

  • ブラウザ氏:Apacheさん、ユーザーがリンクをクリックしただけで、保護されたディレクトリにあるファイルをフェッチする必要があります。
  • Apache:やあ、バディ、そんなに速くない!ログインとパスワードは何ですか?
  • ブラウザー氏:ええと、わかりません。私はあなたにそれを言う必要がありますか?JavaScriptさんはあなたにその情報を与えただけではありませんか?
  • Apache:はい、JavaScriptDIDさんから教えてもらいました。しかし、あなたはJavascript氏ではありません。あなたはブラウザさんです。Javascript氏ではなく、私のセキュリティを乗り越えようとしているので、JavaScript氏に尋ねたのと同じ質問をする必要があります。クレデンシャルとは何ですか。個人的には受け取らないでください、それは私の仕事です。
  • ブラウザ氏:ええと、答えはわかりません。エンドユーザーに聞いたほうがいいです。ねえ、エンドユーザー。ログインとパスワードは何ですか?
  • エンドユーザー:ブラウザさん、どうしたのですか!!! ほんの一秒前ではなかったのですか?なぜその情報が再び必要なのですか?うーん。MrBinkyに何が起きているのか聞いたほうがいいです。
于 2013-01-10T14:44:19.140 に答える