web.xml文件中的7个错误的安全配置
web.xml文件中的7个错误的安全配置
关于Java的web.xml文件中配置认证和授权有大 量 的 文章。本文不再去重新讲解如何配置角色、保护web资源和设置不同类型的认证,让我们来看看web.xml文件中的一些常见的安全错误配置。
(1) 自定义的错误页面没有配置
默认情况下,Java Web应用在发生错误时会将详细的错误信息展示出来,这将暴露服务器版本和详细的堆栈信息,在有些情况下,甚至会显示Java代码的代码片段。这些信息对为他们的病毒需找更多信息的黑客来说是一种恩惠。幸运的是,通过配置web.xml文件来展示自定义的错误页面是非常容易的。使用如下的配置后无论服务器在任何时候发生HTTP500错误,一个非常好的错误页面就会被显示出来。你可以为HTTP状态码添加另外的错误页面。
1
2
3
4
|
< error-page > < error-softwaresecurity >500</ error-softwaresecurity > < location >/path/to/error.jsp</ location > </ error-page > |
另外,web.xml文件应该被配置以防止详细的错误堆栈信息被显示出来,我们可以通过配置<exception-type>来实现。因为Throwable是Java中所有Exception和Error的基类,下面的代码片段将很好的确保堆栈信息不被服务器显示。
1
2
3
4
|
< error-page > < exception-type >java.lang.Throwable</ exception-type > < location >/path/to/error.jsp</ location > </ error-page > |
然而,如果你采用如下的处理方式,你依然会将堆栈信息展示出来:
<%
try {
String s = null;
s.length();
} catch (Exception e) {
// don't do this!
e.printStackTrace(new PrintWriter(out));
}
%>
这里请记住在合理配置了你的web.xml文件后,需要使用合理的日志记录技巧。
(2)绕过认证和授权
下面的代码片段展示了如何设置基于web的访问控制以便所有在”安全”目录中的一切只能被带有”admin”角色的用户访问。
1
2
3
4
5
6
7
8
9
10
11
|
< security-constraint > < web-resource-collection > < web-resource-name >secure</ web-resource-name > < url-pattern >/secure/*</ url-pattern > < http-method >GET</ http-method > < http-method >POST</ http-method > </ web-resource-collection > < auth-constraint > < role-name >admin</ role-name > </ auth-constraint > </ security-constraint > |
从常识观点来看,指定了GET和POST的<http-method>元素限定了*只有*GET和POST请求是被允许的。事实上不是这样,任意未列举的HTTP方法实际上都是允许使用的,即采用其他的HTTP方法可以绕过认证和授权。Arshan Dabirsiaghi有一个非常好的论文总结了该问题并向你展示了如何使用上述配置中未列举的任意的HTTP动词(像HEAD)和完全假冒的动词(像TEST或JUNK)来绕过web.xml中配置的认证和授权保护。
幸运的是,解决方案非常简单。仅仅需要从web.xml文件中移除<http-method>元素即可。
(3)SSL未配置
在所有使用敏感数据的应用中,SSL都应该被配置以保护数据传输安全。当然你可以在web服务器上配置SSL,但是一旦你的应用服务器设置了合适的SSL key,那么在应用急启用SSL是非常容易的。
1
2
3
4
5
6
|
< security-constraint > ... < user-data-constraint > < transport-guarantee >CONFIDENTIAL</ transport-guarantee > </ user-data-constraint > </ security-constraint > |
(4)未使用安全标示
很多web站点使用SSL进行认证,但是后面或者是阻止非SSL的的后续交互或者使得一部分网站内容仍然可以通过非SSL的访问。这使得会话的cookie(也就是JSESSIONID)容易受到session劫持攻击。要阻止它,cookie可以通过添加安全标志来创建,这确保了浏览器将不会在非SSL环境下传递cookie。
在Servlet规范的旧版本中,没有标准的方式来将JSESSIONID定义为安全的。现在在Servlet3.0中,<cookie-config>元素可以用于确保这个。
1
2
3
4
5
|
< session-config > < cookie-config > < secure >true</ secure > </ cookie-config > </ session-config > |
(5)未使用HttpOnly标志
cookie可以使用HttpOnly标志创建,这将确保cookie不能被客户端脚本访问。这帮助减轻了一些常见的XSS攻击。就像Security标志一样,旧版本的Servlet规范没有提供相应的支持。在Servlet3.0中可以如下的配置它:
1
2
3
4
5
|
< session-config > < cookie-config > < http-only >true</ http-only > </ cookie-config > </ session-config > |
除了Servlet3.0的这种新的标准的方式,旧版本的Tomcat允许在server.xml中使用供应商特定的useHttpOnly属性来启用它。该属性在Tomcat5.5和6中默认是禁用的。在Tomcat7中,该属性默认是启用的。因此即使你在web.xml中将其设置为false,然后部署在tomcat7中,除非你修改了server.xml文件,否则你的JSESSIONID依然是HttpOnly的。
(6) 使用URL参数来跟踪session
Servlet3.0规范中的<tracking-mode>允许你定义JSESSIONID是存储在cookie中还是URL参数中。如果会话ID存储在URL中,那么它可能会被无意的存储在多个地方,包括浏览器历史、代理服务器日志、引用日志和web日志等。暴露了会话ID使得网站被session劫持攻击的几率大增。然而,确保JSESSIONID被存储在cookie中非常容易:
1
2
3
|
< session-config > < tracking-mode >COOKIE</ tracking-mode > </ session-config > |
(7) 未设置会话超时时间
用户喜欢长时间的会话因为他们很方便。黑客喜欢长时间的会话因为他们有足够的时间来实施像session劫持攻击等。安全和可用性总是会出现冲突。一旦你知道如何使得你的会话存活,你可以按如下方法来配置活动时间:
1
2
3
|
< session-config > < session-timeout >15</ session-timeout > </ session-config > |
总结
构建和部署安全的应用需要从不同的受益人处获取需求。环境和配置和编码自身一样重要。通过思考这些常见的安全错误配置,希望你可以创建更加安全的应用。
web.xml文件中的7个错误的安全配置的更多相关文章
- web.xml文件中的web-app元素 部署
[转载]web.xml文件中的web-app元素 (2012-05-24 13:35:57) 转载▼ 标签: 转载 分类: java 挺全 的 呵呵呵 转了 原文地址:web.xml文件中的web-a ...
- web.xml文件中加载顺序的优先级
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- 当你的Spring IOC 容器(即applicationContext.xml文件)忘记配到web.xml 文件中时
当你的Spring IOC 容器忘记配到web.xml 文件中时,启动服务器就会报错. 部分错误如下: Caused by: org.springframework.beans.factory.NoS ...
- WEB项目web.xml文件中classpath: 跟classpath*:使用的区别
引用一篇很不错的文章:http://blog.csdn.net/wxwzy738/article/details/16983935 首先 classpath是指 WEB-INF文件夹下的classes ...
- web.xml文件中配置ShallowEtagHeaderFilter需注意的问题
问题现象及解决方法 今天在Spring MVC应用中加入ShallowEtagHeaderFilter时,发现返回的响应中没有etag头,上网查了很多相关资料,也试了很多方法依然不起作用.在查看web ...
- web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序
首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet最终得出结果 ...
- 如何在web.xml文件中引入其他的xml文件(拆分web.xml)
转载自:http://www.blogjava.net/jiangjf/archive/2009/04/09/264685.html 最近在做一个Servlet+javaBean的项目,服务器用的是t ...
- web.xml文件中context-param、listener、filter、servlet的执行顺序
首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...
- web.xml文件中<mime-mapping>
http://blog.csdn.net/sccemstanford/article/details/9064155 ————————————————————————————————————————— ...
随机推荐
- MySQL设置binlog日志的有效期自动回收
设置日志保留天数,到期后自动删除 查看当前日志保存天数: show variables like '%expire_logs_days%'; 默认是0,即永不过期. 通过设置全局参数修改: set g ...
- 计算机网络课程优秀备考PPT之第四章介质访问控制层(四)
为了记录自己从2016.9~2017.1的<计算机网络>助教生涯,也为了及时梳理和整写笔记! 前期博客是, 计算机网络课程优秀备考PPT之第一章概述(一) 计算机网络课程优秀备考PPT之第 ...
- SOCKET的一些注意事项
1. 如果采用同步处理,其实,是可以多次接受数据的, MemoryStream ms = new MemoryStream(); while (true) { Console.Wri ...
- Chapter 2 Open Book——30
I looked down. His hands were clenched into hard fists again. 我向下看,他的双手又一次收紧握成拳头. Mr. Banner came to ...
- 实验吧Web-FALSE
笔记: PHP函数isset(): 检测变量是否设置 只能用于变量,传递任何其它参数都将造成解析错误.若想检测常量是否已设置,可使用 defined() 函数 格式: isset ( mixed v ...
- 2016 C++及系统软件技术大会亮点
2016 C++及系统软件技术大会将于201610月28日-29日在上海举办!此次2016 C++及系统软件技术大会秉承"全球专家. 连接智慧"的理念!大会特邀C++之父Bjarn ...
- JS复习:第八章
一.全局作用域: 所有在全局作用域中声明的变量.函数都会变成window对象的属性和方法.全局变量不能通过delete操作符删除,而window对象上定义的属性可以. 二.窗口大小 使用resizeT ...
- osgOcean测试
#include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osgGA/TrackballManipu ...
- CentOS系统使用配置文件修改IP地址详细教程
在VM虚拟机安装的centos系统,默认使用的是dhcp自动获取ip地址的方式,而我自己想用这个centos在局域网内搭建一个小型演示站点,这个自动获取ip地址的方式就明显不好了,那么centos如何 ...
- ESFramework ——可堪重任的网络通信框架
ESFramework是一套性能卓越.稳定可靠.强大易用的跨平台通信框架,支持应用服务器集群.其内置了消息的收发与自定义处理(支持同步/异步模型).消息广播.P2P通道.文件传送(支持断点续传).心跳 ...