Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mega如何在不需要许可的情况下将文件保存到硬盘_Javascript_Php_Html_Security - Fatal编程技术网

Javascript Mega如何在不需要许可的情况下将文件保存到硬盘

Javascript Mega如何在不需要许可的情况下将文件保存到硬盘,javascript,php,html,security,Javascript,Php,Html,Security,我不确定是不是该问这个问题,所以请随意将我的问题移到别处或关闭它。 有人告诉我,Javascript只有在浏览器上发生诸如拖放之类的显式事件并给它一个文件句柄时,才能从磁盘进行写和读操作 如果是Mega(ex upload),当您单击“下载”时,您将直接将文件保存到磁盘,而无需保存文件或安装浏览器的任何扩展。 这是Javascript或HTML5的一个特性,因为在我看来,在这种情况下,这意味着一个可怕的安全问题 编辑1: 因此,我的问题是,Mega如何在磁盘上进行写操作,而不显示浏览器弹出的保存

我不确定是不是该问这个问题,所以请随意将我的问题移到别处或关闭它。
有人告诉我,Javascript只有在浏览器上发生诸如拖放之类的显式事件并给它一个文件句柄时,才能从磁盘进行写和读操作

如果是Mega(ex upload),当您单击“下载”时,您将直接将文件保存到磁盘,而无需保存文件或安装浏览器的任何扩展。
这是Javascript或HTML5的一个特性,因为在我看来,在这种情况下,这意味着一个可怕的安全问题

编辑1:
因此,我的问题是,Mega如何在磁盘上进行写操作,而不显示浏览器弹出的
保存到
对话框,并自行决定将文件放在何处只需在响应中发送正确的标题,这样浏览器就知道如何保存而不是打开。这与javascript或HTML5无关

例如,在PHP中:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
我不知道Mega使用什么服务器端技术,但这是基本前提


编辑:关于“另存为”对话框为什么不出现的编辑问题,这是一个浏览器设置。例如,默认情况下,Chrome会在没有提示的情况下保存到您的下载文件夹(在Windows上)

奇怪。。。我每天都在使用Mega,它总是显示“保存到”对话框。这不取决于您的浏览器设置吗


我没有足够的声誉来添加评论,因此我不得不将此作为一个答案发布,对此表示抱歉。

这个问题有些模糊,要正确回答,我们可能需要有关您的系统和浏览器供应商/版本的更多信息。Mega使用一些非常酷的东西来处理下载和文件

根据客户端环境的不同,它们使用:

  • 文件系统API(Chrome/Firefox扩展polyfill)
  • Adobe Flash SWF Filewriter(旧浏览器的回退)
  • BlobBuilder(IE10/IE11)
  • MEGA Firefox扩展(已弃用)
  • 基于Arraybuffer/Blob的内存
  • MediaSource(实验流媒体解决方案)
  • IndexedDB基于blob(Firefox 20+)
使用所有这些方法,无需用户干预/授权即可直接下载将取决于浏览器兼容性。我在Linux上使用Firefox,当我从Mega中选择一个文件并单击下载时,会出现一个对话框,因此,实际上,我必须授权下载。但是如果你看一下,在“from”字段中你会看到“blob”这个词,这是一个来自“from”的符号

您可以看到一个Blob API利用率示例和检查(案例4:基于Arraybuffer/Blob内存的,第15、293、324、802行)

window.URL=window.URL | | window.webkitURL;
var blobExample=新的Blob(['\
\n\
\n\
Blob文件中的您好!\n\
'],{type:'text/html'});
var blobLink=document.createElement('link');
blobLink.rel='html';
blobLink.href=window.URL.createObjectURL(blobeExample);
document.body.appendChild(blobLink);
var anchor=document.createElement('a');
anchor.href=window.URL.createObjectURL(blobeExample);
anchor.download='blob example.html';
anchor.textContent='下载二进制大对象';
document.body.appendChild(锚定);

=)

您的意思是没有弹出“保存到”
-对话框?那他们怎么知道去哪里保存呢?既然我没用过Mega,如果你能更详细一点就好了。你用什么浏览器?在我默认安装的Google Chrome中,当单击文件的下载链接时,我从未得到“另存为”对话框。它会自动将文件保存到我的“下载”目录中。如果你的浏览器就是这样工作的,@johnnycardy下面的答案是“神奇的力量是什么”@zrvan但仍然使用mega将无法查看下载列表中的下载以及下载如何在不使用浏览器的情况下直接从下载页面下载到驱动器。有关其工作原理的详细说明,请参阅。Php如何在不通知您的情况下写入磁盘?你能想象这意味着什么吗?如果你说的是TrueMea首先使用JavaScript将文件下载到内存中,这是每个浏览器的一个主要错误,因为它使用私钥(也存储在JS中)从内存中解密。与PHP标题无关。@Kiwy PHP无法写入磁盘(除非在您机器上的服务器上运行)。它是你的浏览器(例如Chrome),可以在没有对话的情况下下载。在Chrome中,请参阅设置>显示高级设置>内容设置>自动下载。与响应标题无关。那真是个安全漏洞,不是吗?这与浏览器设置无关,因为它会在下载完成时发出提示,而不是像其他网站一样在启动时发出提示。@DanFromGermany我没有为任何类型的文件设置任何自动下载,我要求我的浏览器始终询问文件应放在何处。事实上,我总是在不记得下载的情况下使用mega插件。这与浏览器设置无关。我在Firefox中下载的所有其他文件都会提示我“另存为”框。Mega在下载完成之前不会显示提示。事实上,Mega的插件安装在我使用的所有不同的firefox上。。。这就是问题所在,但在我看来blob特性还是有点奇怪。Mega使用XMLHttpRequest.onprogress事件在blob中存储块
window.URL = window.URL || window.webkitURL;

var blobExample = new Blob(['\
<!doctype html>\n\
<html>\n\
<body>Hello from Blob file!</body>\n\
</html>'], {type: 'text/html'});

var blobLink  = document.createElement('link');
blobLink.rel  = 'html';
blobLink.href = window.URL.createObjectURL(blobExample);
document.body.appendChild(blobLink);

var anchor = document.createElement('a');
anchor.href = window.URL.createObjectURL(blobExample);
anchor.download = 'blob-example.html';
anchor.textContent = 'Download the binary large object';
document.body.appendChild(anchor);