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 >
|
总结
构建和部署安全的应用需要从不同的受益人处获取需求。环境和配置和编码自身一样重要。通过思考这些常见的安全错误配置,希望你可以创建更加安全的应用。
相关推荐
为了提高代码的可维护性和复用性,有时需要将一部分配置内容提取到独立的XML文件中,再在`web.xml`中引用这些文件。本文将详细介绍如何在`web.xml`中引入其他XML配置文件,并解决可能出现的问题。 #### 步骤一:...
在实验中,我们首先在 WebContent 目录下创建了 404.jsp 和 500.jsp 两个文件,然后在 web.xml 文件中配置了错误处理页面的路径。 实验的结果是,我们成功地设置了错误处理页面,并且在出现异常时,浏览器可以正确...
web.xml 配置详解 web.xml 配置详解是指在 ...web.xml 配置详解是 Java Web 应用程序中一个非常重要的配置文件,它包含了很多描述 servlet/JSP 应用的各个方面的元素,对于 Java Web 应用程序的开发和配置非常重要。
本示例文件"演示web.xml文件中error-page标签的使用.zip"包含了一个简单的演示,以帮助理解这个功能。 `<error-page>`标签允许开发者指定当特定的错误发生时显示哪个页面。这可以极大地提升用户体验,因为默认的...
本文将详细介绍WEB-INF中的web.xml文件中的配置,包括Context配置、Resource配置、resource-ref配置,以及对应的Java类编写。 一、Context配置 在WEB-INF中的web.xml文件中,添加以下配置:...
在本例中,错误日志提示我们,web.xml文件中存在语法错误,具体来说,是标签中的配置错误。 解决方案是,检查web.xml文件中的配置,确保所有的标签都正确地关闭,并且没有任何语法错误。在本例中,我们需要将错误的...
- 在web.xml中,我们可以使用`<context-param>`标签来指定Log4j配置文件的位置,例如: ```xml <param-name>log4jConfigLocation <param-value>/WEB-INF/classes/log4j.properties ``` - 接着,使用`...
除了以上提到的配置,`web.xml`还可以包含错误页面定义、安全配置(如`<security-constraint>`)、本地化支持(`locale-encoding-mapping-list`)等。正确的配置有助于提升应用程序的性能、安全性和可维护性。理解并...
在大型Web工程中,web.xml文件非常重要,因为它提供了一个中央配置点,便于管理Web应用的各种资源和服务。 ### Servlet版本与web.xml的结构 不同版本的servlet规范定义了不同的web.xml结构。以Servlet 2.3和...
在Java Web应用程序中,`web.xml`文件是部署描述符(Deployment Descriptor),它是配置应用核心行为的重要文件。它定义了Servlet、过滤器、监听器、会话超时、错误页面等关键组件,使得开发者可以对Web应用进行定制...
总之,`web.xml`配置文件在Struts2.0框架中起着桥梁和纽带的作用,连接了用户的请求与应用程序的处理逻辑,是每个Struts2开发者必须掌握的基础知识。通过深入理解和实践,开发者可以构建出更加健壮、高效的Web应用。
web.xml 文件中各个标签的介绍 web.xml 文件是 Java Web 应用程序的核心配置文件,用于描述 Web 应用程序的...web.xml 文件中的这些标签都是 Web 应用程序的重要组成部分,它们共同构成了 Web 应用程序的架构和配置。
以下是对web.xml配置文件中各个元素的详细说明: 1. **定义头和根元素** - **XML头**:文件开头必须包含XML声明,指定XML版本和字符编码,如`<?xml version="1.0" encoding="UTF-8"?>` - **DOCTYPE声明**:紧接着...
`web.xml`是Java Web应用的核心配置,它管理了Servlet、过滤器和监听器等组件,以及会话、安全、错误处理等多个方面。理解和熟练掌握`web.xml`配置,能有效提升开发效率,保证应用的稳定性和安全性。在实际开发中,...
此时,`Web.xml`可能不是唯一的部署描述符来源,服务器会将多个XML配置文件合并,包括`META-INF/web-fragment.xml`和`WEB-INF/web.xml`。 总结,`Web.xml`是Java Web应用的心脏,它定义了应用的架构、行为和运行...
一、web.xml文件结构 `web.xml`文件通常分为三部分:`<web-app>`元素内的全局配置、`<servlet>`元素定义的Servlet和`<servlet-mapping>`元素映射的Servlet。 1. `<web-app>`元素:这是`web.xml`的根元素,包含了...
WEB.xml详解主要涉及了Java EE Web应用程序的标准配置文件web.xml的详细使用说明,这是Servlet规范中定义的一个配置文件,用于配置web应用的初始化参数、servlet和filter、监听器等组件。 首先,web.xml文件在Web...
在Java EE应用开发中,`web.xml`是一个至关重要的配置文件,它被称为部署描述符(Deployment Descriptor)。这个文件主要用于定义应用程序的行为,特别是关于Web应用程序的组件、如Servlet、过滤器和监听器等的配置...