防止通过URL下载

时间:2015-02-09 21:57:41

标签: javascript php mysql download

我目前有一个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");   
    }
}

3 个答案:

答案 0 :(得分:1)

基本上,你不能。

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

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

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


我无法准确说出您真正想要做的事情,但想要仅向某些用户提供下载的网站通常会执行以下操作:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

  1. 创建文件 .htaccess (在Windows上很难做到[文件名],尝试从互联网上下载该文件)文件夹中的文件要下载内容:
  2. http://paste.ots.me/562452/text

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

    1. 使用内容
    2. 创建 download.php 文件

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

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