在不安全的聊天室或者论坛等,看到一张图片,实际上他可能是请求了你的某个银行的转账接口,让你的钱转到别人的账上,如果打开了这个图片,并且之前已经登陆过银行账号,并且Cookie仍然有效,那么钱就有可能被转走了。
<img src="http://bank.test.com/withdraw?account=youraccount&amount=10000&for=arthinking">为此,常见对因对措施有:
对用户输入进行XSS过滤;
敏感的业务操作都需要添加各种形式的校验:如密码、短信验证码等;
敏感信息Cookie设置有效期尽可能短...
本文首次发表于: HTTP常用请求头大揭秘 以及公众号 Java架构杂谈,未经许可,不得转载。
4.5、HTTP缓存机制 4.5.1、缓存请求指令客户端可以用Cache-Control请求首部来强化或者放松对过期时间的限制。
指令 说明Cache-Control: max-age=<seconds> 拒绝接受缓存时间长于seconds秒的资源,如果seconds为0,则表示请求获取最新的资源;
Cache-control: no-cache 除非资源进行了再验证,否则这个客户端不会接受已缓存的资源;
Cache-control: no-store 缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存;
Cache-control: only-if-cached 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有新的拷贝;
Cache-control: no-transform 不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等HTTP头不能由代理修改
Cache-Control: max-stale[=<seconds>] 表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间
Cache-Control: min-fresh=<seconds> 表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应
4.5.2、缓存响应指令 指令 说明
Cache-Control: max-age=<seconds> 设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)
Cache-control: no-store 缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存
Cache-control: no-cache 在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)
Cache-Control: must-revalidate 一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求
Cache-control: no-transform 一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求
Cache-control: public 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)
Cache-control: private 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器
Cache-control: proxy-revalidate 与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略
Cache-control: s-maxage=<seconds> 覆盖max-age或者Expires头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它
4.5.3、服务器再验证 指令 说明
If-Modified-Since: Date 第一次响应报文提供Last-modified,第二次请求带上这个值,给服务端验证缓存是否有修改,无修改则返回:304 Not Modified
If-None-Match: ETag 第一次响应报文提供ETag,第二次请求带上这个值,给服务端验证缓存是否最新,无修改则返回:304 Not Modified,
Last-modified和ETag有什么区别?
有任何改动,ETag都会变动,但是同一秒内的改动,Last-modified是一样的。
4.6、HTTP代理