我目前有一个 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 用作凭据,然后他们可以随时使用它们。
<小时/>我无法准确说出您真正想要做什么,但是想要仅向某些用户提供下载的网站通常会执行以下操作:
- 让用户登录您的网站
- 这会在 Cookie 中提供唯一的用户 ID,该 ID 随来自该用户的所有 HTTP 请求一起提供。
- 然后创建一个独特的下载网址,其中包含一些独特的代码。
- 在您自己的数据库服务器端,创建一条记录,将这些下载 URL 代码与其所属的用户 ID 相关联。
- 当针对该唯一下载 URL 发出 HTTP 请求时,您的服务器会从 URL 中提取下载代码,从带有请求的 Cookie 中提取用户 ID,在数据库中查找代码并检查这是否是正确的用户 ID对于这些代码。
- 如果它们匹配,服务器就会提供适当的下载文件。
- 如果不匹配,服务器会提供一个文件,告知用户他们无权下载该文件,并指示他们必须执行哪些操作才能获得授权。
- 服务器通常会在短时间内(例如几天)后使这些下载代码过期,因此它们只能在短期内使用。
这种技术使得不存在每个人都可以使用的通用下载链接,并且它可以防止一个用户与其他用户共享下载链接。
此技术不会尝试辨别在浏览器 URL 栏中键入的请求与来自 iframe 的请求或来自 Javascript 请求的请求之间的区别,并且通常不需要知道其中的区别。可以通过任何这些方式获取的任何内容都可以相同地使用,因此仅允许一种方式并阻止其他方式并没有真正的安全优势。
关于javascript - 阻止通过 URL 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420188/