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 根目录中。

此外,用户的浏览器从未经过身份验证。只有您的 Web 服务器通过您的 PHP 脚本进行了身份验证。可以这样想,您的 Web 服务器充当人类并使用基于 PHP 的各种 Web 浏览器进行身份验证。坐在家里电脑前的人从未对他们的网络浏览器进行身份验证。Apache 进行身份验证,读取该文件的内容,并将其作为某种代理传递给最终用户。

初始脚本加载页面后。任何具有指向“受保护”文件夹内文件的 href 属性的锚点标签都会弹出要求用户进行身份验证的弹出窗口。您误认为这是一个过期的会话。发生这种情况是因为托管 PHP 脚本的服务器(而不是最终用户的计算机)在您的 PHP 脚本中进行了身份验证。最终用户的计算机甚至还没有进行一次身份验证。在他们输入他们的凭据后,他们应该可以在接下来的会话中使用。

你问的是不可能的。每当用户单击链接时,将始终提示用户输入用户名和密码。为什么不让他们登录?如果文件需要密码保护,为什么要绕过保护。您可能需要重新考虑您的方法。

进一步细分:这是您的 PHP 脚本。

  • 最终用户:嘿,我刚上网给你
  • Apache:太好了,让我运行这个从受保护目录中获取文件的 php 脚本
  • PHP:好的。让我去拿文件。嘿,Apache,我被指示使用 httpd basic auth 从您的文件夹中获取文件!
  • 阿帕奇:奇怪!行。登录名和密码是多少。除非你有那个信息,否则我不能给你文件。
  • PHP:我把这些信息硬编码在我里面。干得好。
  • 阿帕奇:谢谢!这是那个文件。
  • PHP:太好了。感谢您的文件!现在,你能把它还给最终用户吗?干得好。马上回到你身边。
  • 阿帕奇:谢谢!我有那个文件。在这里你去最终用户。
  • 最终用户:哇,我可以看到文件了!感谢 Apache 和 PHP!

现在,最终用户单击链接以下载文件

  • 最终用户:嘿,我现在想下载那个文件。
  • 阿帕奇:好的,登录名和密码是什么。
  • 最终用户:嘿!我不需要那个。我不是刚给你的吗?
  • 阿帕奇:不。PHP 为您获取了该文件并告诉我给您一份副本。你实际上从来没有通过我的大门。那么密码是什么!
  • 最终用户:让我问一下堆栈溢出的 Mrbinky3000 是怎么回事。

这是您的 JavaScript 示例将进行的对话。

  • 最终用户:嘿,浏览器先生,请访问此 URL。
  • 浏览器先生:嗨,阿帕奇,你能把这个 URL 的页面给我吗?
  • 阿帕奇:给你,浏览器先生。享受页面。
  • 浏览器先生:哦,我看到这里有一些 Javascript 先生的代码。

最终用户输入用户名和密码,点击提交按钮

  • 浏览器先生:好的。是时候执行一些javascript了。给你,Javascript先生。
  • JavaScript 先生:嘿,阿帕奇!我被告知从子文件夹中获取此页面并将其显示在浏览器先生的正文中。唯一的问题是,该子文件夹受基本身份验证保护。所以我需要给你这些凭据。
  • 阿帕奇:嘿。JavaScript 先生怎么了。我看到您希望我从受保护的目录中获取此页面。我想这样做,我们是朋友,但我需要问你这个:登录名和密码是什么。没什么私人的,这只是我的工作。
  • JavaScript 先生:Apache 没问题!我有证件。干得好。
  • 阿帕奇:太好了!我会去这里为你取那个页面。这是那个页面。玩得开心。
  • JavaScript 先生:感谢您为我获取该文件,Apache。嘿,浏览器先生,我需要用 Apache 刚刚给我的文件替换你的正文内容。
  • 浏览器先生:当然,没问题。让我从你这里拿走。我们到了,你取来的那一页现在是我的身体。
  • 最终用户:哇,我现在可以看到那个受保护的页面了,感谢浏览器先生。是时候点击链接了。

最终用户单击链接。

  • 浏览器先生:嘿 Apache,我的用户刚刚点击了一个链接,现在我需要在那个受保护的目录中获取一个文件。
  • 阿帕奇:嘿,伙计,不要这么快!登录名和密码是多少?
  • 浏览器先生:呃,我不知道。我需要告诉你吗?JavaScript 先生不是刚刚给了你这些信息吗?
  • Apache:是的,JavaScript 先生确实给了我这个。但你不是 Javascript 先生。你是浏览器先生。由于您试图通过我的安全,而不是 Javascript 先生,所以我需要问您与 JavaScript 先生相同的问题。请问是什么证件。不要把它当成个人,这是我的工作。
  • 浏览器先生:呃,不知道答案。我最好询问最终用户。嘿,最终用户。登录名和密码是多少?
  • 最终用户:浏览器先生怎么了!!!我们不是刚刚在那里吗?为什么你又需要那个信息?嗯。最好问问 MrBinky 怎么了。
于 2013-01-10T14:44:19.140 回答