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

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

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

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

全站遵循 RESTful 设计的呀~简直要疯了~也不知道哪个 wbd 做的默认规则
25059 次点击
所在节点    程序员
214 条回复
lolizeppelin
2021-11-18 01:05:12 +08:00
30 楼就是标准做法
get 带 body 也是靠这个
参数里加也算是标准写法 有些 http 库就直接支持
ryd994
2021-11-18 02:31:44 +08:00
@lesismal 结论:这傻帽根本没有自己实测过。首先,用于 Web 服务的 Nginx 为什么要带 dav 模块编译?各大发行版的默认 Nginx-minimal 就是没有 dav 模块的。你为什么编译的时候不可以关掉
其次,Nginx 的 dav 模块是需要 dav_methods 指令开启的。还可以根据不同路径使用不同的设置。
http://nginx.org/en/docs/http/ngx_http_dav_module.html

自己不会配置 Nginx 还要怪 restful 不行?
lesismal
2021-11-18 07:23:01 +08:00
@ryd994

> 用于 Web 服务的 Nginx 为什么要带 dav 模块编译?各大发行版的默认 Nginx-minimal 就是没有 dav 模块的。你为什么编译的时候不可以关掉

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

这意思没说默认就有 dav 模块吧?也没说默认就开启吧?人家这意思说的就是默认不开启、如果需要开启单独编译吧?所以你要不要再自习看看 :joy:


> 其次,Nginx 的 dav 模块是需要 dav_methods 指令开启的。还可以根据不同路径使用不同的设置

你有没有想过今天给你开一个特殊的明天给他开一个特殊的,安全部门还得维护各种,开发与运维、安全人员耦合,而且毕竟留了口子,哪天不小心、或者包括人员离职交接、新功能上线导致纰漏留了漏洞等情况?而对于开发而言,统一协议规范、提高这点安全标准并不费多大事,为什么要为了开发自己的便利去与更多部门产生工程上的耦合?代码讲究高内聚低耦合,但代码是服务于整个工程的,工程思维要考虑整体,包括架构、运维、安全相关的部门协作等各种,只考虑自己方便不是一个好的努力方向

而且,我上楼转那个帖是为了说明 PUT 不安全相关的问题,所以,nginx 编译方案并不适合作为安全问题甩锅的理由


> 自己不会配置 Nginx 还要怪 restful 不行?

抛开 nginx 不谈,restful 就好用吗?
1. 真实项目里有多少人在用真正的 restful (只是用了各种 method 就以为是 restful 这种不算)?
2. 有多少人真正理解了 restful ?不怕各位笑话,我就没太懂,因为搞得太绕太复杂,要理解它所谓的精妙设计就要不少心智成本,就像有人讨论说的,它跟 OOP 一样存在过度抽象的问题,需要前期消耗很多顶层设计、预先设计的成本,我只是人云亦云、具体我是不了解了,因为好的东西讲究大道至简少即是多,这种搞一堆套路定义的东西、把本来可以简单的问题复杂化,看半小时还没入门、让人云里雾里的东西,我默认它是垃圾。
3. 虽然我不真的懂 restful ,但是可以简单对比下 restful 和 GET/POST+结构化 body 的方式,最简单的思考,restful 不仅多种 method 要仔细设计,仍然也需要 body 参数的结构化设计,而 GET/POST+结构化 body ,省去了 method 设计这块的心智成本,哪个更简单省力?另外,抛开 web 领域,其他服务器领域,命令号 /路由+结构化 body 到处再用,IM/游戏 /分布式系统内部 RPC 交互,也就 HTTP 这垃圾协议早期设计者内心戏太多搞得这么复杂,号称的文本协议可读性好都是扯淡,即使二进制协议,浏览器或者其他工具转换一道可视化出来也不是啥问题,但对于整个互联网流量、算力会带来巨大的节约,相应的也是巨大的性能提升。早期的用户量小,这点协议复杂带来的成本不高,现在都互联网爆发的时代了、大数据的时代了,HTTP 协议的复杂性带来的能源消耗都是不小的开销,只是历史包袱太重没法随便切换成更高效的协议,我目测相比于更高效的二进制协议,它浪费的能源甚至不比挖矿少。

所以,是大家 “怪” restful 不行还是它真的不行?
Bromine0x23
2021-11-18 08:10:18 +08:00
WebDAV 的问题咋又车到 RESTful 了,不 diss 一下不舒服是吗
aicfe
2021-11-18 08:40:53 +08:00
我记得 springboot 的话,可以前端 js 改成 post 方式 加个参数 _method = put/delete ,后端不用变就行
sxfscool
2021-11-18 08:58:51 +08:00
@xuanbg 有些 put 和 post 的路由是一样的,简单替换不行
eason1874
2021-11-18 09:42:02 +08:00
@SimonOne #38
@lesismal #39 网上抄来抄去的那篇文章就是启用 WebDAV 又不配置认证,发现可以匿名上传,然后得出结论:可以匿名上传是因为 WebDAV 依赖的 HTTP PUT 不安全

就是错误归因。类似于把 Redis 暴露到公网又不配置认证,被挂马了,说 Redis 认证方法不安全

PUT 方法和 Nginx + PUT 组合在云厂商的服务里多得是,配置类 API 大量使用 PUT ,对象存储上传文件也用 PUT ,CDN 既用 Nginx 也用 PUT 。自认能“快捷简单地入侵”的快去 SRC 提交漏洞,有这本事拿个几万美金奖励轻轻松松

HTTP Methods 本身就只负责操作,安全认证都不是人家的活。安全没做好,只 allow GET 也能被 SQL 注入
zjttfs
2021-11-18 09:44:38 +08:00
@sxfscool 做个拦截统一转发
TossPig
2021-11-18 09:53:14 +08:00
GET/POST+结构化 body ,省去了 method 设计这块的心智成本
-----------
这个看不先去了哈,那 http1.1 设计就太冗余了,按这个说法最安全的最好的浏览器发展方向,应该把包括 GET 在内的所有方法,都自动封装为一个 WANT 发送

各大厂商的开发 API 还搞什么 restful 呀,完全是莫名其妙的增加心智成本
jessun1990
2021-11-18 10:05:16 +08:00
我觉得真安全,就上 HTTPS 。然后跟客户说,这是新需求,加钱!!
dcsuibian
2021-11-18 10:06:26 +08:00
@lesismal 这篇明显是有问题的,网上转过来也得自己思考下。
如果实实在在地打印过 http 请求中的内容,看过 http 的格式就知道 method 的最大区别就是第一行的格式。
( http 是基于 tcp 的,只要你把 http 请求收到的 tcp 内容打出来看看就知道了)

什么叫“从 Java 代码的角度考虑问题”?这跟什么语言都根本没关系,是 http 协议的内容。
“在研发的代码里,终端(浏览器或客户端)过来的流量,最终通过 java 的注解,携带参数进入到了研发写了一个方法里来了。”写这篇文章的人,明显就是直接上手 spring boot ,连基本的 http 协议都没了解过。

至于什么 nginx 会遇到问题,那就去配啊。
Loku
2021-11-18 10:10:30 +08:00
阿里云的 API 不都是 PUT 、DELETE 这样用么,难道阿里云不安全?
sutra
2021-11-18 10:11:33 +08:00
从技术角度来说,修改也很简单,改用 POST + Header 方式来模拟 PUT DELETE PATCH (都不用自己写,我记得 Spring 有现成的 Filter );前端从 HTTP Client 库那边拦截修改一下即可。
Rwing
2021-11-18 10:12:04 +08:00
楼主和楼里的各位,我觉得我们参考大厂就好了
国内的包括阿里云 百度 网易等等接口都有 PUT 的,把这个直接甩给客户看就好了
sutra
2021-11-18 10:14:11 +08:00
play78
2021-11-18 10:16:55 +08:00
各位总是从技术角度讨论。
最近新闻,国美监控员工上班上网流量行为。
很简单,你们客户网管那边的防火墙,还监控不了 put 和 delete ,只能监控统计 get 和 post 的请求。
所以你们就按要求改就是了。说再多也没用,本来就不是技术问题。
[狗头]
0o0o0o0
2021-11-18 10:20:03 +08:00
实际测试,nginx minimal 在反向代理的时候支持所有函数,不需要编译 dva 模块。

所以说如果你使用的是反向代理,是不需要编译 dva 模块的,如果不需要编译 dva 模块,那么也就不会因为 put 而产生漏洞,也不需要去禁止 put 函数。
lesismal
2021-11-18 10:20:33 +08:00
@dcsuibian #51

> 这篇明显是有问题的,网上转过来也得自己思考下。
> 如果实实在在地打印过 http 请求中的内容,看过 http 的格式就知道 method 的最大区别就是第一行的格式。
>( http 是基于 tcp 的,只要你把 http 请求收到的 tcp 内容打出来看看就知道了)

我还算了解一点 tcp 和 http ,我这有一份手撸的 golang poller tcp 框架,支持了 http 异步解析,其中包括一份完整的 http parser:
github.com/lesismal/nbio/blob/master/nbhttp/parser.go

> 什么叫“从 Java 代码的角度考虑问题”?这跟什么语言都根本没关系,是 http 协议的内容。
> “在研发的代码里,终端(浏览器或客户端)过来的流量,最终通过 java 的注解,携带参数进入到了研发写了一个
> 方法里来了。”写这篇文章的人,明显就是直接上手 spring boot ,连基本的 http 协议都没了解过。

不管是不是 spring boot ,我都没出来你说这篇文章明显有问题是指什么问题。那篇文章作者的意思是从运维、安全部门部署的网关 /代理软件的层面不能允许 PUT/DELETE 这些方法,而从开发的层面不管什么 Method 都能拿到相关参数进行验证。
“这跟什么语言都根本没关系” —— 这句是对的。

> 至于什么 nginx 会遇到问题,那就去配啊。

nginx 的问题,,
我转的帖子的作者的意思是不同部门 /工种在整个工程实践的不同层上的安全考量角度,这跟用什么语言或者 java 用什么框架没关系,甚至 nginx 怎么配置都不适合这么实践——这一点我在上一楼(#43 )回复前面小哥的内容里面也提到过了,层主也可以看下

蹭住也可以多思考下,然后再看看我是不是转帖时候没思考 :joy:
pinkSlime
2021-11-18 10:22:39 +08:00
现代人的心智是有多脆弱啊,restful 都成心智负担了,像相对论这种东西根本就不该存于世间吧
buubiu
2021-11-18 10:24:07 +08:00
楼上说了这么多,还是没懂到底啥安全问题

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

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

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

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

© 2021 V2EX