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个错误的安全配置的更多相关文章

  1. web.xml文件中的web-app元素 部署

    [转载]web.xml文件中的web-app元素 (2012-05-24 13:35:57) 转载▼ 标签: 转载 分类: java 挺全 的 呵呵呵 转了 原文地址:web.xml文件中的web-a ...

  2. web.xml文件中加载顺序的优先级

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  3. 当你的Spring IOC 容器(即applicationContext.xml文件)忘记配到web.xml 文件中时

    当你的Spring IOC 容器忘记配到web.xml 文件中时,启动服务器就会报错. 部分错误如下: Caused by: org.springframework.beans.factory.NoS ...

  4. WEB项目web.xml文件中classpath: 跟classpath*:使用的区别

    引用一篇很不错的文章:http://blog.csdn.net/wxwzy738/article/details/16983935 首先 classpath是指 WEB-INF文件夹下的classes ...

  5. web.xml文件中配置ShallowEtagHeaderFilter需注意的问题

    问题现象及解决方法 今天在Spring MVC应用中加入ShallowEtagHeaderFilter时,发现返回的响应中没有etag头,上网查了很多相关资料,也试了很多方法依然不起作用.在查看web ...

  6. web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序

    首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet最终得出结果 ...

  7. 如何在web.xml文件中引入其他的xml文件(拆分web.xml)

    转载自:http://www.blogjava.net/jiangjf/archive/2009/04/09/264685.html 最近在做一个Servlet+javaBean的项目,服务器用的是t ...

  8. web.xml文件中context-param、listener、filter、servlet的执行顺序

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  9. web.xml文件中<mime-mapping>

    http://blog.csdn.net/sccemstanford/article/details/9064155 ————————————————————————————————————————— ...

随机推荐

  1. ArcGIS导出辖区边界点坐标

    1.使用ArcGIS打开.mxd地图文件 2.选择[Geoprocessing][ArcToolbox]  3.展开菜单,选中如图所示菜单,双击打开 4.选择对应的辖区节点   5.点击OK后,会在左 ...

  2. openstack私有云布署实践【4.1 上层代理haproxy配置 (科兴环境)】

    官方文档上的高可用配置,它推荐的是使用haproxy的上层代理来实现服务组件的主备访问.或者负载均衡访问   一开始我也是使用haproxy来做的,但后来方式改了   测试环境:haproxy + n ...

  3. java泛型操作复习,以及讲解在android中使用的场景

    android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但是需要对传进来的数据进行处理,此时就使用到泛型,示例如下: public abstra ...

  4. PHP学习过程_Symfony_(2)

    今天正式学习Symfony;首先推荐一篇文章"十分钟学习Symfony"(这是我们老大写的,由于那些搞seo的家伙的粘贴复制也不写出处,老大干脆把代码库给清理了,不过幸好我提前fo ...

  5. Android的JunitTest

    1.在manifest的配置:首先,manifest的下层级中配置: <instrumentation android:name="android.test.Instrumentati ...

  6. XmlNode和XmlElement区别

    今天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement.这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作).上网搜罗了半天,千篇一律的答 ...

  7. ggplot2 分面相关设置(facet)

    分面设置在ggplot2应该也是要经常用到的一项画图内容,在数据对比以及分类显示上有着极为重要的作用, 下面是两个经常要用到的分面函数. facet_wrap(facets, nrow = NULL, ...

  8. kettle 连接Hadoop 遇错

    kettle从windows中往hdfs中写文件

  9. JVM 几个重要的参数

    <本文提供的设置仅仅是在高压力, 多CPU, 高内存环境下设置>  最近对JVM的参数重新看了下, 把应用的JVM参数调整了下.  几个重要的参数 -server -Xmx3g -Xms3 ...

  10. Openjudge-计算概论(A)-求出e的值

    描述: 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e .输入输入只有一行,该行包含一个整数n(2<=n<=15),表示计算e时累加到1/n! ...