【问题标题】:Prevent Download Via URL阻止通过 URL 下载
【发布时间】:2015-02-09 21:57:41
【问题描述】:

我目前有一个 PHP 文件要求您使用 MySQL 数据库登录。登录后,会出现 3 个链接,允许我下载文件。虽然,如果我直接访问该文件,它将下载而无需登录。如何阻止人们通过 URL 栏下载,但仍允许 JavaScript 下载文件?

如果这不可能,我还能做些什么来允许下载吗?比如用PHP代替JavaScript下载?我知道 JavaScript 是客户端,所以我想知道这是否会阻止它访问下载。

我不能提供太多代码,但这里是下载它的 JavaScript。链接基本调用downloadLink函数;

    var downloadURL = function downloadURL(url) {
     cLog("STDOUT: Attempting Download Of File: "+url);
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};

function downloadLink(fileLink) {
    if (fileLink) {
         cLog("STDOUT: File Link: "+fileLink);
        downloadURL("/DownloadAssets/"+fileLink);
         cLog("STDOUT: Function Finish, File Should Be Queded");
    } else {
         cLog("ERROR: No File Link");   
    }
}

【问题讨论】:

    标签: javascript php mysql download


    【解决方案1】:

    基本上,你不能。

    HTTP 服务器完全不知道任何给定的 HTTP 请求是来自浏览器 URL 栏、页面中的 iframe 还是来自 Javascript 代码。它们都只是 HTTP 请求。

    如果您想允许某些类型的访问并阻止其他类型的访问,那么您必须在您的服务器上实施访问控制,以便除非提供正确的凭据,否则无法满足 HTTP 请求。

    浏览器环境面临的挑战是,您的客户端代码中几乎没有什么是安全的(任何人都可以检查它),因此有决心的黑客将能够找到您放入客户端的任何密码javascript 用作凭据,然后他们可以随时使用它们。


    我无法确切说出您真正想要做什么,但只想为特定用户提供下载的网站通常会这样做:

    1. 让用户登录您的网站
    2. 这在他们的 cookie 中提供了一个唯一的用户 ID,该用户的所有 HTTP 请求都来自该用户。
    3. 然后创建一个包含一些唯一代码的唯一下载 URL。
    4. 在您自己的数据库服务器端,创建一条记录,将这些下载 URL 代码与其所属的用户 ID 相关联。
    5. 当针对该唯一下载 URL 的 HTTP 请求进入时,您的服务器从 URL 中提取下载代码,从请求的 cookie 中提取用户 ID,在数据库中查找代码并检查这是不是正确的用户 ID对于那些代码。
    6. 如果匹配,服务器会提供相应的下载文件。
    7. 如果不匹配,服务器会提供一个文件,告知用户他们无权下载该文件,并指示他们必须做什么才能获得授权。
    8. 服务器通常会在一段时间(例如几天)后过期这些下载代码,因此它们只能在短期内使用。

    这种技术使得没有每个人都可以使用的通用下载链接,并且它可以防止一个用户与其他用户共享下载链接。

    此技术不会尝试区分在浏览器 URL 栏中键入请求的人与来自 iframe 或来自 Javascript 请求的人之间的区别,通常不需要知道区别。任何可以通过这些方式获得的任何内容都可以同样使用,因此只允许一种方式并阻止其他方式并没有真正的安全优势。

    【讨论】:

    • 好详细的答案
    【解决方案2】:

    这并不是你用 javascript 解决的问题,因为它是在客户端运行的。当您有用户登录时,您需要在他们的 jar 中放置一个 cookie,表示他们已经登录。在您的网络服务器上,只允许人们访问具有该身份验证 cookie 的 URL。

    【讨论】:

      【解决方案3】:

      首先,您的网站需要一些“登录系统”。然后您需要 Apache Web 服务器(或其他处理“重写 mod”规则的服务器,但在 Apache 配置中非常简单 [只需创建 .htaccess 文件])。

      您需要做的就是阻止对包含文件的文件夹中的文件的访问(并仅将其提供给已登录的用户)。

      1. 在要下载内容的文件夹中创建文件 .htaccess(在 Windows [该文件名] 上很难做到,请尝试从 Internet 下载该文件):

      http://paste.ots.me/562452/text

      (此 .htaccess 文件应将所有 HTTP 请求重定向到该文件夹​​到文件 download.php

      1. 创建 download.php 包含内容的文件:

      http://paste.ots.me/562451/text

      //由于未知原因,我无法在帖子中粘贴代码。

      【讨论】:

      • 如何调用这个 php 文件?我应该使用href标签吗?如果是这样,这会阻止空白页面吗?我喜欢我现在拥有的JavaScript下载器,因为页面不会改变......可以用这个来实现吗
      • 只要打开你想要的文件,网络服务器就会执行 download.php 来检查对文件的访问,如果这个用户被登录,他就会得到文件。 PHP 脚本将强制在 Web 浏览器中进行下载操作,因此页面不会移动到其他站点(如果用户可以访问文件,如果没有,它将显示错误消息并移动到其他站点)。您只需从 JS 重定向到 yourpage.com/downloadAsset/somefile.exe,PHP 将在访问验证后在 Web 浏览器中开始下载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多