被客户告知 HTTP 的 PUT 请求不安全,甩锅给我们要求整改

2021-11-17 14:17:10 +08:00
 TossPig
真的是要吐,这段时间好几个客户单位反馈业务系统无法使用,一直报错

上去一看,PUT 请求全部被拦截,也不知道家防火墙商干的好事,默认把 PUT 请求全部给禁了,还给客户培训说 PUT 请求就是不安全

给客户解释了半天,根本不听,就说防火墙这样设置肯定有他的道理,说是我们使用了不安全的请求方法,要我们负责安全整改

全站遵循 RESTful 设计的呀~简直要疯了~也不知道哪个 wbd 做的默认规则
25057 次点击
所在节点    程序员
214 条回复
labulaka521
2021-11-17 17:43:21 +08:00
我现在觉得全 post 真香
ThirdFlame
2021-11-17 18:05:18 +08:00
因为最原始的 http 里面 put 是上传文件的一种方式(比如 iis6 ) 所以被视为不安全的 method 。

所以有些 waf/扫描工具 /扫描人员 直接报告说支持 put 就是不安全
karloku
2021-11-17 18:45:05 +08:00
webdav 你坏事做尽(
passerbytiny
2021-11-17 18:50:26 +08:00
有些客户,你不要把他当人看,楼主的客户大概就是这种人。基本上,凡是拿预算买东西而不是花自己钱买东西的客户,不论中外,都不是真客户,你不能拿正常人的思维去对付。
zjsxwc
2021-11-17 19:18:28 +08:00
对方业务里在用老系统?老系统涉及 put 请求就有漏洞。
TossPig
2021-11-17 19:21:29 +08:00
确实给了私钥的哈

不太认同那种因为甲方就要应承他的想法,什么都照甲方的想法改,最后出问题了还是会甩锅到自己头上。

就像十年前的项目,你不兼容 IE 就说你系统有问题,技术都顶着,技术栈全线更新全切 Chrome 了,现在客户也知道旧版 IE 不能正常显示不完全是系统的

就给了两个方案,要么双倍预算我们重做系统,要么防火墙放行
TossPig
2021-11-17 19:23:01 +08:00
有些想法很中肯,客户傻逼就不陪他玩,我绕过就行

但这次就是不太想绕过了,要么重新开发,要么你把 put 给放了
xuanbg
2021-11-17 19:35:00 +08:00
put 改成 post 不就完了吗,批量替换分分钟的事情。
CloudMx
2021-11-17 21:15:37 +08:00
因为有很多安全工程师拉低了圈子的下限.
knives
2021-11-17 21:21:16 +08:00
支持楼主硬刚哈😀

之前也遇到过一次同样的问题,结果没刚过甲方的运维。最后还是妥协了,在前端加了个拦截器,把所有 PUT 和 DELETE 请求换成了 POST ,同时附加一个 X-HTTP-Method-Override=PUT/DELETE ;后端再按 X-HTTP-Method-Override 给换回来……

倒也没废多少事,但是非常不爽。
hronro
2021-11-17 21:51:30 +08:00
@ThirdFlame #22

什么叫最原始的 HTTP ?

HTTP 0.9 ? HTTP 1.0 ? HTTP1.1 ?

HTTP 标准里面 PUT 的语义是修改 Entity ,对应到你说的文件的例子里面修改文件,上传文件应该是用 POST 。

所以你说的东西只能说是某个 HTTP 实现的问题,并不能怪到 HTTP 标准本身头上。
TypeError
2021-11-17 21:56:58 +08:00
还是甲方好
sagaxu
2021-11-17 22:00:21 +08:00
API 接口只能用 POST 和 GET ,且 http 状态码只能用 200 ,否则你都不知道会发生什么事
pengtdyd
2021-11-17 22:01:26 +08:00
只要能加钱,啥都能改,不给钱,请滚
ThirdFlame
2021-11-17 22:32:34 +08:00
@hronro #31 我哪里怪 http 标准了 我是怪“waf/扫描工具 /扫描人员 直接报告说支持 put 就是不安全”
Puteulanus
2021-11-17 23:04:11 +08:00
你们给客户推开源安全,闭源危险的文章,让他们要求防火墙那边开源,狗头
IvanLi127
2021-11-17 23:05:25 +08:00
甲方给钱才叫爸爸,不给钱就是孙子。合同以外的需求,给钱就开发咯。
SimonOne
2021-11-18 00:10:34 +08:00
“PUT 方法,由于 PUT 方法自身不带验证机制,利用 PUT 方法即可快捷简单地入侵服务器,上传 Webshell 或其他恶意文件,从而获取敏感数据或服务器权限。”
甘霖娘的,网上的资料翻来覆去就抄这句,也不说个所以然。
lesismal
2021-11-18 00:33:14 +08:00
@SimonOne
随便就搜到个:blog.csdn.net/CHEndorid/article/details/111277629
而且和楼主公司的情况挺像的,不会就是同一个公司吧?

直接贴过来:

```text
一、背景
最近研发让我开一下服务器的 put 、delete 方法,被我以不安全的 http 方法给拒绝了。

研发表示我很无理,put 怎么就是不安全的了,在他看来,put 和 post 只是语义上的不同。如果 put 是不安全的方法,那么 post 也是不安全的方法了。

网上的说法也是分为两派,一派说这些都是不安全的方法,要关掉;另一派说它们只是语义上的区别,不存在安不安全。

二、一探究竟
经过我和研发各自编写测试用例来论证后,我明白了为什么会有这样的分歧:我是从 nginx 作为 web 服务器的角度来看问题的,研发是从 java 代码上来看问题的。

1 、为什么说 POST 和 PUT 只是语义上的区别?
在研发的代码里,终端(浏览器或客户端)过来的流量,最终通过 java 的注解,携带参数进入到了研发写了一个方法里来了。比如研发对某个自定义方法使用 PUT 的注解,那么终端通过 PUT 方法传递的参数就会进入到这个自定义方法中。有点编程经验的话,就会知道,到了你写的方法里,这些参数就随便你玩了。

对于 PUT 、POST ,研发都可以通过添加不同注解的方式,得到传递的参数,然后进行操作。所以研发会认为他们只是语义上的区别。

2 、为什么说 PUT 、DELETE 是不安全的方法?
对于 nginx ,可以使用 HttpDavModule 编译 nginx (./configure --with-http_dav_module ),开启 PUT 、DELETE 等方法。开启后,恶意攻击者就可以直接将病毒文件等传到 nginx 服务器上,所以 PUT 等方法对 nginx 来说是不安全的。

3 、上面两个问题是否矛盾?
并不矛盾。

假如研发人员打包一个 jar 包,这时客户端直接访问这个 jar 包起的服务,那么 put 传递过来的所有参数,是可以由研发人员编写的代码控制的。只要控制得没有猫病,那么就是安全的。假如开发的是一个 tomcat 容器部署的工程,参数也是一样可以由研发的代码控制的。

同时,用 nginx 也可以反向代理 put 方法(不用 HttpDavModule ),所以只要后端服务对 put 服务做好控制,nginx 不需要做任何更改,也就实现了对 put 方法的支持。

但 nginx 不能单独开启 put 等,因为研发的代码不能对 nginx 做控制。

三、结论
后端服务可开启 put 方法,只需要后端服务对 put 传递的参数做好控制,并实现 put 方法即可。

nginx 不可开启 put 方法,这是一种危险的方法。
```


另外:竟然真的有人认为 REST 挺好,是有多傻。
marshmallow
2021-11-18 00:34:47 +08:00
如果用 Spring 的话可以试试 HiddenHttpMethodFilter

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816040

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX