在看 《图解HTTP》的时候,发现在2.5中说到:
鉴于HTTP/1.1 的PUT方法自身不带验证机制,任何人都可以上传,有安全问题,一般网站都不使用该方法。
我想知道:
PUT方法自身不带验证机制,怎么理解,POST/GET方法就有验证机制了吗?是怎么保证安全的?
一直很喜欢图解系列的书,作为科普入门很好,没想到居然有这样明显的低级错误。建议参考RFC7230-7235,这是http的一手资料,其次HTTP权威指南。
另外put也不是传文件用的,错的太离谱了。
能具体的说一下吗?
@苍枫露雨: 说什么?验证还是put?
@Blackheart:
说一下PUT的安全问题,为什么就不安全了,按照@幻天芒的说法,HTTP请求自身都没有验证机制,那为什么web容器,如tomcat7,禁止PUT,不禁止GET,POST等呢,
@苍枫露雨:
密码学方面的安全问题是由HTTPS来保证的,另外http有authentication的reqeust header来提供授权的问题。这个层面的安全和http method是没有关系的。
HTTP协议层面的安全其实指的是语义上安全(即这个操作不会产生副作用),另外一个语义是幂等性。从这个层面来说,PUT是不安全的,因为put的语义是整体替换或者创建新资源,会产生副作用;但是它是幂等的,执行一次和n次的结果是一样的。
另外,你提到的验证应该是属于e-tag这类的验证吧,属于标识资源有没有修改,是否可缓存相关的验证,和安全无关。
@Blackheart:
谢谢你的回答,让我对http有了更清晰的认识,
但是为什么web容器禁止了PUT没有禁止POST还是有疑问,POST在语义上也是不安全的吧,
@苍枫露雨:
是的,POST在HTTP层面属于不安全且不幂等的语义。
因为早期的时候http主要是配合html使用的,html中的form早期只支持get,post,所以put一直没有出现在实际使用中。现在有些已经浏览器已经允许html的from使用PUT和DELETE了,AJAX则是很早很早就支持PUT和DELETE了。
刚翻书确认了下,原文之后还有一句,实际上内容没有什么问题。至于验证机制,HTTP请求都没有,需要配合你的web程序进行验证。
那为什么web容器,如tomcat7,禁止PUT,不禁止GET,POST等呢,
@苍枫露雨: tomcat不熟,反正我是没见过,哪儿禁止PUT了。
@幻天芒:
我是用tomcat7 测试的, 构造了一个put请求,返回403,
也不是完全禁用,可以配置的,
@苍枫露雨: 这个得看配置和你的程序处理的。我这边使用rest,这些都是可用的。
http本身就是脸盲,他不能存储用户的状态信息,所以需要cookie机制去识别。