javascript - 阻止通过 URL 下载

标签 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");   
    }
}

最佳答案

基本上,你不能。

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

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

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

<小时/>

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

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

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

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

关于javascript - 阻止通过 URL 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420188/

相关文章:

javascript - 自定义 WMD 编辑器按钮的默认值 - 无法摆脱 wmd-prompt-background

php - apache 和 php 500 错误噩梦

php - 标签和内容的搜索算法

java - session bean 中的 EntityManager 异常处理

mysql - 内部连接 ​​3 个表并计算字段的平均值

javascript - 如何在 ajax 回调中访问 John Resig 类中的成员?

javascript - mvc _layout 在 renderbody() 执行之前调用函数

javascript - 通过 AJAX 接收 PHP 的响应

php - 如何在 javascript 中获取输入索引 - 可以使用 jQuery

php - 通过 Ajax 使用 PHP 在 MySQL 中插入和检索数据