这是我用来在客户端使用javascript处理文件的程序的简化版本。
HTML:
<input id='myinput' type='file' accept='.png, .jpg, .jpeg' />
Javascript:
var myinput = document.getElementById('myinput');
myinput.addEventListener('change', function(e) {
/* 1. capture the file */
var file = e.target.files[0];
/* 2. make a fileReader object */
var reader = new FileReader();
/* 3. the load event listener */
reader.addEventListener('load', function(e) {
var fileContentAsText = e.target.result; // <-- is this line safe?
/* 5. functions for manipulating the file would go here */
}, false);
/* 4. passing the file to the filereader object */
reader.readAsText(file);
});
或多或少,我的程序用于处理png或jpg类型的文件,对其进行处理,然后使修改后的版本可供下载。
一切都发生在客户端。
由于没有任何内容发送到服务器,因此我应该关注任何安全漏洞吗?
如果我将其发送到服务器,则几乎所有我用来验证文件的工作都将在php中进行,并且我将有足够的把握确保操作足够安全。
由于我没有将其发送到服务器,因此我将应用的所有php机制均不适用。
实际问题:
想到的是设置其他元素的innerHTML的文本框,或者其中的src / onerror属性可用于恶意目的。我需要注意这些类型的攻击吗?因为我在这件事上阅读的所有内容都涉及到验证去往服务器的文件。
答案 0 :(得分:1)
您必须意识到漏洞,例如跨站点脚本,开放重定向,敏感信息存储(不是完整列表),这些漏洞也可能会影响纯客户端应用程序。
实际上,这意味着重要的部分是注释中的点5.
-加载的文件将发生什么。例如,您可以在处理后将其一部分存储在localStorage中,如果存储了“敏感”信息(无论您的上下文如何),这可能会带来风险。例如,如果将零件写回客户(如果我理解正确,我认为是这种情况),则可能构成注入威胁。如果您例如向html编写内容,例如图像exif的注释,则最直接的注入方法是XSS。但是,您还应该考虑用户收到结果后结果文件会发生什么情况。是否将其显示在可能易受某种注入或缓冲区溢出等影响的应用程序中?考虑具有已知缓冲区溢出漏洞的图像查看器。假设恶意用户准备了映像并将其提供给受害者。该映像的制作方式不会直接导致缓冲区溢出,但是在您的应用程序对其进行转换之后,它将利用显示该映像的客户端中的漏洞。当然,这是第三方客户端软件的漏洞,但是您的应用程序被用来隐藏漏洞并促进攻击。
因此,请尝试从整体上考虑系统,您的应用程序可能只是复杂攻击中的基石,您的目标应该是最大程度地降低对攻击者的有用性。这是模糊的建议,但这完全取决于您对上传的文件实际执行的操作。
我想到的另一件事是恶意的上载图像可能会挂起浏览器进程,这是对客户端的拒绝服务。您应该能够避免这种情况。 (当然,用户从自己那里上传了它,但是可能已经从别人那里收到了,所以可能不知道她正在上传的是什么-在您的情况下可能是无效的。)
在处理过程中,所有图像信息的一部分都可以用于查询内容,例如从exif信息或其他信息中找到相机供应商。这样的查询也可能易于注入,从而导致通过恶意图像伪造查询。因此,在处理过程中从文件中读取的所有内容通常都应视为不受信任,就像在服务器上所做的一样。
答案 1 :(得分:0)
客户端永远不会安全。即使您在accept
中使用input type="file"
属性,它也只会标识打开的对话框来标识给定的类型并仅显示它们。但是用户仍然可以在此处选择Select All
选项,然后选择任何类型的文件。并且reader.readAsText(file);
将按原样阅读,并且不会进行验证。这意味着黑客可以上传所需的任何东西,并可以将其注入应用程序。因此,请始终考虑通过服务器端语言进行验证。
然后制作修改版
这没有任何意义,因为应用程序可以上传任何内容,而不是指定的文件类型。