1 resttemplate与close_wait
背景,植入resttemplate请求对外数据,发现每次请求会新建一个连接,而且完了也不关,显示close_wait,显然,在1分钟establish状态后,对方发起fin,我方ack,然后没有发fin,到这四次挥手就中断了
在以前的tcp实际中也有碰到过,客户端没有close导致不发fin包的经历 17tcp close端口占用 & setReuseAddress 【本地】
解决方案,改连接池
2 iframe 跨端口
背景
A.80 iframe 3个网站
A.8080,A.8081,A.8082
先要证明iframe不能跨端口
http://localhost:8080/wechat-demo/iframe.html
http://localhost:8990/ss
/Users/mac/work/netty-test/src/main/java/com/jds/test/http/BodyToResponseEncoder.java
/Users/mac/work/netty-test/src/main/java/com/jds/test/websocket/WebSocketServerJob.java
/Users/mac/Documents/apache-tomcat-8.5.11/webapps/wechat-demo/iframe.html
小插曲,本地可以,线上不行,
因为本地使用jetty,没有x-frame-options:SAMEORIGIN(注意,该x-frame-options对chrome大小写不敏感)
而线上由tomcat/conf/web.xml统一打开了
参考:https://blog.csdn.net/liangpingguo/article/details/86703284
<filter> <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <async-supported>true</async-supported> // 以下为额外添加 <init-param> <param-name>antiClickJackingEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>antiClickJackingOption</param-name> <param-value>SAMEORIGIN</param-value> </init-param> <filter>
看上去tomcat也没给机会
解决方案
生产:代理服务器
P.80 ? app=A80 iframe
P.80 ? app=A8080
P.80 ? app=A8081
P.80 ? app=A8082
开发;
fiddler篡改response,删掉X-Frame-Options
interface A
class A1 implements A
class A2 implements A
guice注入A1,A2,按名称
在aop中控中,用getBeanByClass形式去拿,是拿不到的,反哺失败
这里同事有个误区,A1,A2本身没有使用aop切面,直接注入原对象,为什么会报错
如下:
B {
inject
name(A_A1)
private A A1's object
};
cglib B = cglib(new B)
当反哺时,用A这个类型去取bean,是取不到的;考究的做法是,读取待反哺对象的name注解,如果有,则通过名称去bean里取
4 http response splitting
https://blog.csdn.net/qq_35976271/article/details/103276682
4.1 本地的jetty以
reponse.setRedirect(url + " HACK:hh ")
并不能完成攻击,根据抓包,发现jetty将 换为空格(%20)了
4.2 URLEncode.encode(url) 会导致非法url,浏览器认不出,与30multipart/form-data和application/x-www-form-urlencoded的区别(二)urlencoded之自动deocde 结论一致,urlencode会encode :/?=,本质是为了将用户的数据转义,如果将正常的url也转义了,那么url也就不合法了,正确的做法是对url中的 替换为""
4.3 sendredirect会组装一个http
302
Location:url 在response中植入一个Location头
5 java与javac不一致
java -jar时,发现用的是C:Program Files (x86)Common FilesOracleJavajavapath,32位的
而用的jstack是64的,所以就不行了
解决:在idea terminal中吧path设置到64的java
6 iframe跨域cookie
发现调试时(跨域,用fiddler篡改response报文,删除X-Frame-Options)网站能够被iframe嵌入(这可以理解)的同时,居然跨域带cookie
发现该cookie勾选了Secure,SameSite为空
经过调查,跨域设置SameSite=None和Secure时,谷歌浏览器才会发送Cookie