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

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

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

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

全站遵循 RESTful 设计的呀~简直要疯了~也不知道哪个 wbd 做的默认规则
25066 次点击
所在节点    程序员
214 条回复
lesismal
2021-11-18 12:28:42 +08:00
@rust 我得谢谢你夸我牛,哈哈哈,这一点我认,,
debuggerx
2021-11-18 12:36:58 +08:00
达克效应:越无知的人越自信。
总是有“高人”恨不得重新发明整个互联网。。。
lesismal
2021-11-18 12:37:05 +08:00
另外再跟你们说吧,我自己的 api 类项目里,连 GET 都不用的,统一 POST+结构化 body(json/pb/msgpack/...)

本来交互协议主要两点:
一是路由,RPC 里叫方法,有的游戏为了节省流量和性能会用数值类型、叫命令号之类的,各个领域自定义协议的项目叫法都类似
二是参数。

HTTP 协议本身算是互联网早期产品,设计者当年也都是摸着石头过河,但因为整个互联网不是自家项目,一旦协议定下来,要考虑全网兼容性,所以即使是缺点也不好及时匡正。包括不限于本帖里说的 METHOD 安全性,还有比如 keepalive 之前的短连接、请求不带 id 无法向多数 rpc 那样可以乱序响应所以即使支持 keepalive 和 server side pipeline 了仍然有线头阻塞的问题,甚至再往4层说,tcp 也渣,4层本身也存在线头阻塞的问题,所以各位可以看到,为啥 http2.0 还没普及,quic/http3.0 都出来了并且更被认可,而 quic/http3.0 是 udp 的,可以解决更多问题。
zjsxwc
2021-11-18 12:41:46 +08:00
REST 是 REST
RESTful 是 RESTful
两者不一样。

现代的 web 开发全是基于 REST“表现层状态转换”理念设计的,HTTP 的 URL/URI 就是 REST 的典型代表,而 RESTful api 只是 REST 风格的接口,比如基于 HTTP 的 SOAP 接口由于把请求内容、参数等都隐藏在请求 body 里面,无脑使用同一个个 HTTP URL 地址的就不是 RESTful 接口,而 RESTful 接口简单的说就是 URL 明确的指明了要操作的资源对象,这是区别接口是否 RESTful 的最大特点。

所以如果和 SOAP 那样,即使使用了 PUT 、DELETE 方法的 HTTP 接口也不是 RESTful 接口。



https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services
lesismal
2021-11-18 12:46:07 +08:00
@debuggerx
> 达克效应:越无知的人越自信。

提出这句的时候也可以先送给自己,思考下自己是否听懂了别人在说什么。。。

> 总是有“高人”恨不得重新发明整个互联网。。。

第一,我没说过要重新发明,不是非要重复造轮子而是减少使用上的坑,少即是多
第二,我上一楼聊了点 http2.0 3.0 的,历史、社区兼容性占了很大因素,否则可能早就被优化了。考虑兼容,所以没法只能慢慢先从标准上推进、逐渐更迭,就像老龄社会一样只能等老旧项目自然死亡。
优化不意味着重新发明,而是软着陆,否则,如果不需要优化,你以为谷歌闲的蛋疼搞 quic 、社区闲的蛋疼接纳 quic 并且成为实际的 3.0 ?

拜托楼上某些位大神夸人或者讽刺之前先多了解下技术本身的点,比如 tcp http 协议的实现、历史时期的局限、有那些缺点、以后的优化方向,而不是只看眼下大家都这么用就跟着一块用,人云亦云不知所云也就算了,至少拿出点你们的观点、论据好吧,有论据 vs 无论据口嗨,我嫌累了
lesismal
2021-11-18 13:08:24 +08:00
本来交互协议主要两点:
一是路由,RPC 里叫方法,有的游戏为了节省流量和性能会用数值类型、叫命令号之类的,各个领域自定义协议的项目叫法都类似
二是参数。

之前楼写完上面的落了几句,补充上:
本来简单化一和二就搞定的事情,HTTP 协议非要搞成 Method + 路由 + 参数 三个层次,而且参数还可能有 header 里的 kv form ,还可能有 trailer 的 header 、body ,body 还可能 content-length 或者 trunked ,考虑到社区、历史、兼容因素,可以理解这样的做法。但是你说实际上这协议好不好,我是真没法说好。

饿殍遍野难民潮的时候,富人家施舍点粥米穷人都觉得香。
自己技术积累不够的阶段,社区、别人随便给个能用的轮子就觉得好用、牛逼。

美好的事物不能普遍占据主流——这才是主流的现实情况,劣币驱逐良币的历史故事和当下正在发生、未来也会不断发生的事情都多了去了,都是什么天时地利人和、顺应时代、场景者得天下罢了。

但美,仍然是美。
FakNoCNName
2021-11-18 13:13:12 +08:00
看了楼上的争论才知道还有这么个历史。

@lesismal 这个用法也能用,不过看起来就像说: http 、mqtt 、mysql 、redis 这么多种协议让人头疼,结构复杂、数据容易、还带来了设计的复杂度,我们就全部用的 TCP 流,内部定义一些字段区分不同含义。

复杂的工具( RESTRull )是为了解决复杂问题,一代代人总结整理出来的经验,你不能说自己目前这么干够用就认死了只这么干( post+body )。

我们就尽量按照 RESTFull 设计接口,用起来没觉得复杂,查接口、查日志也方便,开发功能、定位问题等等分类也比较合理,如果现在让我们全都用 post ,接口多起来以后简直要吐血。

如果把 post+body 比作 txt 文档,RESTFull 就跟带标签的 PDF 或者带目录的 word 一样,一两页资料看不出差别,几十上百页呢?

另外说的安全问题,这些早就没了,要说不安全也是使用的人没做好处理,跟什么方法没关系。
lesismal
2021-11-18 13:42:22 +08:00
@FakNoCNName
> 这个用法也能用,不过看起来就像说: http 、mqtt 、mysql 、redis 这么多种协议让人头疼,结构复杂、数据容易、还带来了设计的复杂度,我们就全部用的 TCP 流,内部定义一些字段区分不同含义。

层主可以多了解一些类型的项目,这世界上不是只有 http/mqtt 之类的这几种协议,有太多自定义协议了,只是因为自定义协议多是自家项目、不会形成广大社区、行业的这种 RFC 级别的协议规范,mysql/redis 其实就应该归类于非广泛社区的协议,同样地,它俩也不需要 RFC

> 复杂的工具( RESTRull )是为了解决复杂问题,一代代人总结整理出来的经验,你不能说自己目前这么干够用就认死了只这么干( post+body )。
> 我们就尽量按照 RESTFull 设计接口,用起来没觉得复杂,查接口、查日志也方便,开发功能、定位问题等等分类也比较合理,如果现在让我们全都用 post ,接口多起来以后简直要吐血。
> 如果把 post+body 比作 txt 文档,RESTFull 就跟带标签的 PDF 或者带目录的 word 一样,一两页资料看不出差别,几十上百页呢?

确实需要复杂的基础设施的地方,我也会用,我并不是反对复杂的东西。
我是反对本来可以简单解决的、却把问题搞复杂了。
比如你说的查日志,并非必须 Method 才能搞定,路由分段一样可以解决,比如 /aaa/bbb/...

我上面一楼也有补充的,协议交互主要就两点,而 路由 /命令 这里,我也没限制只能一个层次比如只能 /aaa 不能 /aaa/bbb ,这至少比 HTTP method/路由 /headerbody 各种参数要少了一元设计成本

另外,你的这种观念形成过程可能是反的:是因为从学习到使用都是按社区或者自家项目这样经历下来的,因为用并且用习惯了并且有人说它好、所以自己也觉得它好,可能没有尝试过自己从底向上设计这些基础设施的思考。就像我上一楼补充里说的,别人给你个轮子,能用,就觉得好,所以你对它的好的判断欠缺真正参照物来对比。

可以尝试下了解多一些类型的项目,或者自己自底向上设计基础设施,然后你就会面对这些设计上的关于美的丑的性能优的劣的各种细节考量,然后才能得出更全面的结论。

> 另外说的安全问题,这些早就没了,要说不安全也是使用的人没做好处理,跟什么方法没关系。

这个我前面楼层说过,安全问题不只是代码逻辑,安全还有很多工程逻辑在里面。很多场景都可能因为人没使用好导致安全问题,但是 PUT/DELETE 的问题相对明显,并且这两个方法并非不可替代、禁用它俩用其他简单方案替代成本也不高
xuanbg
2021-11-18 14:35:50 +08:00
@sxfscool 如果楼主遵循 restful ,put 和 post 方法肯定是有 pathvalue 这个区别的,所以可以批量替换。例如新增订单是 post:/xxx/orders ,和修改订单:put:/xxx/orders/{id}
lesismal
2021-11-18 14:57:33 +08:00
@eason1874 未读提醒里没有你的回复,所以才看到

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

专用场景用来对比安全部门的通用场景合适吗? PUT/DELETE 跟 POST 存在上传、删除资源的区别,代理也有不同的 api 、文件服务,能都统一处理吗?而且,我之前楼提到过了,就算按路由配置放行策略,开发、运维、安全部门耦合,这样好吗?并且 POST 替代 PUT 成本很高吗

你举例子的,比如特定厂商的特定的服务或者业务,比如上传配置,接口做好了处理,比如对象存储基本是内部服务代码内网调用的不对外开放的所以也不怕,但是跟通用场景两码事,我好几个楼解释了很多,不只是 nginx 是否可配置、怎么配置,不只是接口代码可不可以处理,还有工程、跨工种协作上的,还有 HTTP 协议本身的

如果都考虑自己眼下这点代码逻辑,那倒是万事大吉。

@TossPig
"那 http1.1 设计就太冗余了" ——事实就是这样子的,不只是 http1.1, tcp 、http2.0 都有缺陷,互联网创世年代摸石头过河,都可以理解,但不好或者不够好就是不好或者不够好。
leeg810312
2021-11-18 15:08:31 +08:00
你自己逻辑搞笑,安全厂商屏蔽 PUT 的理由是你说的幂等不安全吗?你用这个来说明厂商是对的,这不是牛头不对马嘴吗?防火墙厂商认为是 PUT 修改数据不安全,我说 POST 也修改数据那也一样安全,逻辑上哪有问题
leeg810312
2021-11-18 15:10:42 +08:00
@xz410236056 你自己逻辑搞笑,安全厂商屏蔽 PUT 的理由是你说的幂等不安全吗?你用这个来说明厂商是对的,这不是牛头不对马嘴吗?防火墙厂商认为是 PUT 修改数据不安全,我说 POST 也修改数据那也一样安全,逻辑上哪有问题
Lucups
2021-11-18 15:41:13 +08:00
以前公司前端同学说过一个 bug ,最终发现是早期的支付宝小程序版本 PUT 方法不传 body 导致的。
cxe2v
2021-11-18 15:49:50 +08:00
@lesismal #90 不是所有人都有全局观啊,有些人没接触过全局的事情,只会专注于自己眼把前那点东西,很正常的,你这样给他们解释,他们脑袋里没那个概念,讲不通的

就像现在谁要是丢个市政|府的指导意见问题给我,我也是个只看得见自己眼把前东西的瞎子,因为我也没接触过市政|府政策制定到底会影响到哪些方方面面
leeg810312
2021-11-18 15:52:08 +08:00
@lesismal 现在很多主流软件和云厂商的大量 API 都有 PUT DELETE ,在你眼里居然都算专用场景,那什么叫通用?不仅云资源配置、对象存储,其他云厂商服务或软件我随便找几个 API 都有 PUT DELETE 。

Azure 翻译文档 API
https://docs.microsoft.com/en-us/azure/cognitive-services/translator/document-translation/reference/cancel-translation

阿里云日志索引更新
https://help.aliyun.com/document_detail/74912.html

MongoDB Atlas
https://docs.atlas.mongodb.com/api/

ELasticSearch 删除 API
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html#docs-delete-api-request

国际云厂商都是通过众多安全合规标准的,他们有 PUT DELETE 也能通过,凭什么说有 PUT DELETE 就是不安全?在我看来,安全问题并不是 PUT DELETE 本身造成的,但部分安全部门和厂商只会一刀切,这就是懒惰、不思进取、推卸责任。
fru1t
2021-11-18 15:52:11 +08:00
你们就想着自己的业务系统,防火墙哪里就是防你一个的?
业务网络肯定还有许多各个时代的系统,你安全代表他们的安全?
lesismal
2021-11-18 16:12:17 +08:00
@leeg810312
你如果有兴趣辩,可以把我回复的多楼层都看一下,先明确下 带上传 /删除文件的服务和 api 的区别、通用场景包括比如安全部门的需要与你说的云厂 api 的区别,你的云厂 api 自己处理好了那是你云厂自己的事情,所以云厂 api 就代表通用全场景了吗(比如这个帖子说的安全部门的需求)?

其他的,工程逻辑、多工种与部门协作,如果你只站在 curd 这种层次考虑问题,我前面楼层已经包含了的一些基本点你们都不看,那烦请不要跟我继续辩了
lesismal
2021-11-18 16:17:17 +08:00
@cxe2v
是啊,解释这么多,真心累,好多写 curd 的人舒适区里呆久了,就不乐意把自己提到高一点的层面看问题,但凡高看一点,就不至于停留在 "程序员 /码农" 的水准,至少能搞个 "架构师级程序员 /码农" 的水平。
太多从业者都只考虑眼前这点,真的是不配叫工程师了。
yEhwG10ZJa83067x
2021-11-18 16:17:46 +08:00
请问谁可以复现一下 nginx 在 put 情况是否真得可以上传病毒文件?
Bromine0x23
2021-11-18 16:22:03 +08:00
扯那么多,不就管安全的不想花精力,抱着落后的知识,摇着安全的大旗,故步自封,把问题丢给开发呗。

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

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

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

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

© 2021 V2EX