RESTful PUT和DELETE以及防火墙

22
在经典的《RESTful Web Services》书中(O'Reilly出版社, ISBN 978-0-596-52926-0),第251页上说:"有些防火墙会阻止HTTP PUT和DELETE,但不会阻止POST。"
这个说法现在是否仍然正确?
如果确实如此,我就必须允许过载的POST来代替DELETE。

1
问题在于如何判断请求是否会被阻止,在这种情况下,通过POST隧道进行DELETE:我不准备为0.02%的用户(需要引用)破坏REST(这是我衡量此类事件发生频率的标准)。 - Matthew Schinckel
4个回答

19

防火墙阻止 HTTP PUT/DELETE 通常是在阻止传入连接(到防火墙后面的服务器)。假设您可以控制保护应用程序的防火墙,那么您不必担心它。

此外,仅当防火墙对网络流量进行深度检查时,才能阻止PUT/DELETE。加密将防止防火墙分析URL,因此如果您使用 HTTPS (您正在使用 SSL 保护数据吗?),访问您的 Web 服务的客户端将能够使用任何标准的四个 HTTP 动词。


1
我们正在使用HTTPS。(嗯——我应该意识到防火墙甚至看不到头文件。)谢谢! - Mark Lutton
1
很好。强制使用HTTPS解决了我的问题。对于那些在家里玩的人,我的负载均衡服务器(pound)报告了这样的信息:Sep 6 13:00:08 bal01 pound: (b6515b70) error read from 1.2.3.4: Connection timed out:直到今天我才知道这些是被防火墙阻止的DELETE请求。值得注意的是,PUT请求可以正常通过。 - Matthew Schinckel

1

我不会担心过载POST以支持DELETE请求。

HTML 4.0和XHTML 1.0 支持GET和POST请求(通过),因此通常通过隐藏的表单字段来隧道传输PUT / DELETE请求,服务器会相应地读取并分派。这种技术保留了浏览器间的兼容性,并允许您忽略任何防火墙问题。

Ruby On Rails和.NET都以这种方式处理RESTful请求。

顺便说一下,目前可以通过XMLHttpRequest请求对象完全支持GET、POST、PUT和DELETE请求。XHTML 2.0也正式支持GET、POST、PUT和DELETE。


此外,HTML5仅允许在表单上使用get/post,尽管例如ASP.NET MVC使用隐藏的X-HTTP-Method-Override表单字段(如果您选择放置其中一个)来实现服务器映射到正确的HttpPut或HttpDelete方法。 - Adam Tuliper

1

一些七层防火墙可以分析到这个程度的流量。但我不确定有多少地方会进行这样的配置。您可以在serverfault.com上查看这种配置有多受欢迎(您也可以随时与您的IT工作人员核实)。


0

你可以按照自己的意愿配置防火墙(至少在理论上是这样),因此如果一些系统管理员阻止了HTTP PUT/DELETE,不要感到惊讶。

对于一些配置不正确的服务器而言,HTTP PUT/DELETE存在危险:PUT会替换目标服务器上的文档(而DELETE则会删除它们;-))。因此,一些系统管理员决定直接阻止PUT,以防万一安全漏洞被打开。


当然,我们谈论的是在“第7层”上运作的防火墙,而不仅仅是在IP层上的;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接