关于Chrome支持http header最大长度限制的讨论

简介: 关于Chrome支持http header最大长度限制的讨论

Created by Wang, Jerry, last modified on Nov 09, 2016

我们在前端访问ABAP的server的时候,通过OData协议访问一个API的时候,URL中能不能带单引号呢? 我们遇到一个bug,


(1) 在IE里url带了单引号:https://jerry.neo.ondemand.com/dps/odata.svc/Context?KaTeX parse error: Expected 'EOF', got '&' at position 14: orderby=title&̲filter=appUrl%20eq%20%‘CustomerEngagementCenter’%20and%20product%20eq%20’SAP_HYBRIS_CLOUD’%20and%20version%20eq%20’1611’%20and%20(system%20eq%20null%20or%20system%20eq%20’’)%20and%20locale%20eq%20’en-US’


(2) 在Chrome没有单引号: https://jerry.neo.ondemand.com/dps/odata.svc/Context?KaTeX parse error: Expected 'EOF', got '&' at position 14: orderby=title&̲filter=appUrl%20eq%20%27CustomerEngagementCenter%27%20and%20product%20eq%20%27SAP_HYBRIS_CLOUD%27%20and%20version%20eq%20%271611%27%20and%20(system%20eq%20null%20or%20system%20eq%20%27%27)%20and%20locale%20eq%20%27en-US%27


结果就是带单引号的URL不能被ABAP Server处理,直接是HTTP 400错误。所以我想问下,是不是按照OData的协议URL里是不能带单引号的?


我试了下,在Chrome里,地址栏敲’i042416’, 单引号会自动被encode成%27:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MYYRguMs-1628157524704)(https://user-images.githubusercontent.com/5669954/50440083-891cf500-092f-11e9-8915-e858aa5fc9a5.png)]


后台成功收到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6NlJrFUh-1628157524705)(https://user-images.githubusercontent.com/5669954/50440084-891cf500-092f-11e9-8710-1b5780d58d88.png)]


IE的话,不会 自动encode:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvttvCrs-1628157524707)(https://user-images.githubusercontent.com/5669954/50440085-891cf500-092f-11e9-865f-b14a086d945e.png)]


Server端还是能接到,只是不能正常显示:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXzhvlL1-1628157524708)(https://user-images.githubusercontent.com/5669954/50440087-89b58b80-092f-11e9-8c61-ab25a5baa2b7.png)]


昨天的问题,找到了,居然是IE对HTTP Request的header大小没有做限制,我们这个case里,Referer是个很长的链接。 我们的NGINX对header的buffer设置只有1K,所以直接就报400错误了,把buffer调大就解决了。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVrshQhT-1628157524709)(https://user-images.githubusercontent.com/5669954/50440088-8a4e2200-092f-11e9-9af5-e60f61d7d6b9.png)]


Referer很长,那换成Chrome不是一样很长么?Chrome就没问题?


Chrome的Referer只有主要的domain信息

image.png这样就能解释通了。

我刚才测试发现Chrome对http get的header length没有限制:

我在ABAP server直接把接到的referer3 field的value echo回去:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zho9geWm-1628157524713)(https://user-images.githubusercontent.com/5669954/50440091-8ae6b880-092f-11e9-9a12-a0784df6d6ec.png)]


在Chrome postman里拼再长的length,ABAP Server一样能收到并且返回给Chrome


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlljDx1S-1628157524715)(https://user-images.githubusercontent.com/5669954/50440092-8b7f4f00-092f-11e9-9f53-28d2742c6f80.png)]


Test url

http://jerry:50054/sap/bc/abap/zjerry

It is impossible to manually set header Referer in Postman.


相关文章
|
6月前
|
缓存 JavaScript 前端开发
ngsw-bypass HTTP header 和 Service Worker 的关系
ngsw-bypass HTTP header 和 Service Worker 的关系
43 0
|
6月前
|
JavaScript
HTTP header location 重定向 URL
HTTP header location 重定向 URL
|
6月前
|
缓存 Linux Apache
Requests Header | Http Header
Requests Header | Http Header
|
7月前
|
缓存
SAP UI5 OData 请求的自定义 HTTP header 设置方法
SAP UI5 OData 请求的自定义 HTTP header 设置方法
39 0
|
8月前
|
前端开发 Java
java在过滤器中为http请求加请求头header
现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的 这个时候如何将请求头通过后台的方法加进来? 想到用过滤器,用后台方法强制加入请求头。
98 0
|
8月前
|
缓存 安全 网络协议
Web Security 之 HTTP Host header attacks(下)
Web Security 之 HTTP Host header attacks
45 0
|
8月前
|
SQL 缓存 负载均衡
Web Security 之 HTTP Host header attacks(上)
Web Security 之 HTTP Host header attacks
273 0
|
9月前
|
存储 安全 前端开发
认识http的方法、Header、状态码以及简单实现一个http的业务逻辑
认识http的方法、Header、状态码以及简单实现一个http的业务逻辑
57 2
|
10月前
|
Web App开发 缓存 网络协议
Chrome 抓包:快速定位 HTTP 协议问题
Chrome 抓包:快速定位 HTTP 协议问题
153 0
|
11月前
|
Web App开发 缓存 JSON
chrome浏览器自带的开发者工具查看http头以及详解http头
1.浏览器常见HTTP请求头解释 使用chrome浏览器自带的开发者工具查看http头的方法 1.在网页任意地方右击选择审查元素或者按下 shift+ctrl+c, 打开chrome自带的调试工具; 2.选择network标签, 刷新网页(在打开调试工具的情况下刷新); 3.刷新后在左边找到该网页url,点击 后右边选择headers,就可以看到当前网页的http头了;
2963 0