繁体   English   中英

这个客户端应用程序安全吗?

[英]Is this client side application secure?

这是我用来在客户端使用 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 机制都不适用。

实际问题:

  1. 鉴于一切都将在客户端发生,我是否需要验证文件?
  2. 如果是这样,为什么? 我可以采取什么行动?

想到的是设置其他元素的innerHTML的文本框,或者可以利用src/onerror属性进行恶意目的的文本框。 我需要注意这些类型的攻击吗? 因为我在这件事上读到的所有内容都涉及验证发送到服务器的文件。

您必须注意诸如跨站点脚本、开放重定向、敏感信息存储(不是全面列表)等漏洞,这些漏洞也可能影响仅限客户端的应用程序。

实际上,这意味着重要的部分是注释中的第5.点 - 加载的文件会发生什么。 例如,您可以在 localStorage 中处理后存储它的一部分,如果存储“敏感”信息(无论在您的上下文中),这可能会带来风险。 或者例如,如果一个零件被写回给客户端(如果我理解正确的话,我认为是这种情况),它可能会构成注入威胁。 最直接的注入是 XSS,例如,如果您将一些内容写入 html,例如图像 exif 中的注释。 但是您还应该考虑在用户收到结果后结果文件会发生什么。 它是否会显示在可能容易受到某种注入攻击或例如缓冲区溢出的应用程序中? 考虑一个具有已知缓冲区溢出漏洞的图像查看器。 假设恶意用户准备了一个图像并将其提供给受害者。 此图像的制作方式可能不会直接导致缓冲区溢出,但在您的应用程序对其进行转换后,它会利用显示它的客户端中的漏洞。 当然,这是 3rd 方客户端软件的一个漏洞,但您的应用程序被用来隐藏漏洞并促进攻击。

因此,尝试将系统视为一个整体,您的应用程序可能只是复杂攻击的构建块,您的目标应该是最大限度地减少对攻击者的有用性。 这是一个含糊的建议,但这完全取决于您对上传的文件实际执行的操作。

想到的另一件事是恶意上传的图像可能会挂起浏览器进程,这是对客户端的拒绝服务。 您应该能够避免这种情况。 (当然,用户为自己上传了它,但可能不知道她上传的是什么,从其他人那里收到它 - 在您的场景中可能有效,也可能无效。)

在处理过程中,部分图像信息可能用于查询事物,例如从 exif 信息中查找相机供应商或其他任何内容。 此类查询也可能容易受到注入,从而导致通过恶意图像伪造查询。 因此,您在处理期间从文件中读取的任何内容通常都应该被视为不受信任,就像在服务器上完成的一样。

客户端永远不会安全。 即使您在input type="file"使用accept属性,它也只会识别打开的对话框以识别给定的类型并仅显示它们。 但是用户仍然可以在那里Select All选选项并选择任何类型的文件。 reader.readAsText(file); 将按原样读取它并且不会验证。 这意味着黑客可以上传任何想要的东西并可以注入应用程序。 因此,始终考虑通过服务器端语言进行验证。

然后制作修改版

这没有任何意义,因为应用程序可以上传任何内容而不是指定的文件类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM