- 开启Gzip压缩
- 服务器重启后,会话(HttpSession)出异常.
- 服务器网站禁止使用IP直接访问
- XSRF保护
- jsonp安全-referer检测问题
- 项目更新重启后文件仍然是旧的
- 相同的静态文件重复加载
- AES加密出错
tomcat优化
开启Gzip压缩
原因
压缩文件,减少流量,提高传输速度
解决
在Tomcat服务器目录下的conf/server.xml
里找到:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useSendfile="false"/>
添加以下属性:
compression="force"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
注: 其中2048单位为B
服务器重启后,会话(HttpSession)出异常.
原因
Tomcat服务器停止后会保存Session,重启后恢复,如果session中有无法序列化的类,就会出错.
解决
禁止Tomcat服务器停止后保存Session,在Tomcat服务器目录下的conf/context.xml
里的<context></context>
之间添加:
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
服务器网站禁止使用IP直接访问
原因
- 若公布于外网的服务器IP地址未备案,就有可能被工信部查封。这样备案的域名也会无法访问。
- 如果AppScan通过ip访问扫描,会有“发现内部ip泄露模式”的低级别的警告
- 可能会收集有关Web 应用程序的敏感信息,如用户名、密码、机器名和/或敏感文件位置
解决
只允许网站使用一个域名访问(www.minecraft001.com),不能使用其它域名或IP访问.
1.将Tomcat服务器目录下的conf/server.xml
里的<Engine></Engine>
的defaultHost
设置为other
2.在<Engine></Engine>
之间添加:
<Host name="other" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/" reloadable="true" docBase="G:/ServerWeb_Other"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="other_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
同时在G盘内增加项目ServerWeb_Other
(查看主页的附件),此项目会将访问重定向到主域名(www.minecraft001.com)
这样,如果通过任何其它方式访问域名,就会被自动重定向到指定的域名上.
另一个(原来的)Host为:
<Host name="www.minecraft001.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/" reloadable="true" docBase="G:/ServerWeb"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
XSRF保护
XSRF(Cross Site Request Forgery)
原因
- 通过伪装来自受信任用户的请求来利用受信任的网站
解决
- 对于会话(HttpSession)的第一次请求,在返回里添加Cookie:
XSRF-TOKEN
,并设置Cookie路径为根路径 - 对于会话的非第一次请求,则判断请求Cookie里的
XSRF-TOKEN
值是否与会话属性里保存的XSRF_TOKEN
值相同,不同则返回异常
说明
- 第一次请求由会话的
XSRF_TOKEN
属性来判断,未设置此属性为第一次请求,否则为非第一次请求 - 对于第一次请求,不一定必然在返回里添加Cookie,如果uri为非根路径,则不添加Cookie,否则可能会导致其它路径里Cookie的
XSRF-TOKEN
值不同而出错 - XSRF攻击比较少,前提是有针对此网站的恶意网站,并且用户访问了那个恶意网站,恶意网站便可伪装成用户进行操作.(虽然如此,但仍然是可以防护的,因此适合添加上.)
jsonp安全-referer检测问题
介绍
jsonp调用时,有时需要判断调用来源来确保安全,一般使用referer来判断,但有如下的问题.
原因
- 正则过滤不严谨,如只过滤是否存在
qq.com
,则攻击者可以用attack.com?qq.com
此类的方法来绕过 - 空referer,一般情况下浏览器直接访问URL是不带Referer的,所以很多防御部署允许空Referer,但在跨协议调用js时,referer是空的,因此可以绕过referer来攻击
解决
- 采用严谨的正则匹配
- 禁止空referer
- 采用referer与token结合的方式进行检测
项目更新重启后文件仍然是旧的
原因
- tomcat目录内有个work文件夹,此文件夹相当于项目运行时的缓存
解决
- 项目更新后,删除
work
文件夹再重启 - 项目更新后,最好同时也删除tomcat目录内的
logs
文件夹再重启,减少日志混杂.(如果有需要,可以先备份日志再删除)
相同的静态文件重复加载
原因
- 因为相同的静态文件在多个网站间重复存在
解决
- 对于公共的静态文件(js,css),首先尽量使用第三方静态文件网站,其次放置到同一个域名上
AES加密出错
原因
- 默认JAVA仅支持128位密钥,使用256位密钥的时候,会报告密钥长度错误
解决
下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6
下载解压后得到两个包:local_policy.jar
,US_export_policy.jar
,将 JRE 环境中lib\lib\security
中的同名包替换掉。