为什么 OWASP 建议使用 POST over PUT 进行文件上传?
TL;DR:很多东西都不支持 PUT。有时它仅作为扩展提供,启用扩展会增加您的攻击面。
@iain 的评论是正确的,即 SO 问题PUT vs POST in REST与此处相关。从 RESTfulness 的角度来看,PUT 可以很好地更新甚至覆盖文件。
然而,如果你从安全的角度来争论,原来的 HTML 表单从来不支持 PUT,只有 GET 和 POST。有关这方面的很多信息可以在大多数网络浏览器中是否提供 PUT、DELETE、HEAD 等方法?,虽然有些信息已经过时,有些链接已经失效。所以我在这里总结一下:
HTML
AJAX 支持 GET、POST、PUT 甚至 DELETE。但是浏览器中的常见形式却没有。HTML5 确实在其草稿版本中添加了对 PUT 和 DELETE 的支持,但在HTML5 基础结构的当前定义中都找不到 PUT 或 DELETE 。换句话说,浏览器没有义务去理解<form method="PUT">
是否符合 HTML5。
网络服务器
Apache 和 Nginx 都使用 PUT 和 DELETE 作为WebDAV扩展。如果你想强化你的网络服务器,你经常做的一件事是在没有 WebDAV 扩展的情况下编译它。添加扩展会增加攻击面。
另一方面,我们的框架通常不支持 PUT。或者,更常见的是,简单地使用相同的函数来处理 POST 和 PUT,使得 PUT 动词的使用实际上与 POST 相同。
所以,是的,OWASP 指南是有道理的。尽管我会将其重写为:“如果您正在实现完整的 REST,请使用 PUT,如果您不使用 POST,因为它受到更广泛的支持”。
我认为这不应该在列表中,但作为一种猜测,他们提出了这一点,因为这是在没有副作用的情况下进行文件上传的最佳和 RESTful 方式*。老实说,我还没有看到有人在做 PUT。我见过 GET,但它们就像第一次使用 php 脚本。
让我们先把 PUT 放在一边。如果您将 POST 与 GET 进行比较,则 POST 从用户的角度来看更加隐藏,因为它不会附加到可见的 URL。
如果您将其他数据与文件一起发送,则可能对可以操作它的用户可见。但是,这并不会降低或提高安全性,因为无论如何您都不应该信任客户端输入。
*:浏览器可能会截断长的 URI 字符串,例如
我认为有关 PUT 的安全问题来自 WebDAV 协议,其中 PUT 请求允许您指定文件应上传到的路径。如果服务器不对路径实施适当的限制,这可能会让攻击者覆盖重要文件。