关于Java的l⽂件中配置认证和授权有。本⽂不再去重新讲解如何配置⾓⾊、保护web资源和设置不同类型的认证,让我们来看看l⽂件中的⼀些常见的安全错误配置。
(1) ⾃定义的错误页⾯没有配置
默认情况下,Java Web应⽤在发⽣错误时会将详细的错误信息展⽰出来,这将暴露服务器版本和详细的堆栈信息,在有些情况下,甚⾄会显⽰Java代码的代码⽚段。这些信息对为他们的病毒需更多信息的⿊客来说是⼀种恩惠。幸运的是,通过配置l⽂件来展⽰⾃定义的错误页⾯是⾮常容易的。使⽤如下的配置后⽆论服务器在任何时候发⽣HTTP500错误,⼀个⾮常好的错误页⾯就会被显⽰出来。你可以为HTTP状态码添加另外的错误页⾯。
1 2 3 4<error-page>
<error-softwaresecurity>500</error-softwaresecurity> <location>/path/to/error.jsp</location>
</error-page>
另外,l⽂件应该被配置以防⽌详细的错误堆栈信息被显⽰出来,我们可以通过配置<exception-typ
e>来实现。因为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));
}
%>
jsessionid这⾥请记住在合理配置了你的l⽂件后,需要使⽤合理的。
(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)来绕过l中配置的认证和授权保护。
幸运的是,解决⽅案⾮常简单。仅仅需要从l⽂件中移除<http-method>元素即可。
(3)SSL未配置
在所有使⽤敏感数据的应⽤中,SSL都应该被配置以保护数据传输安全。当然你可以在web服务器上配置SSL,但是⼀旦你的应⽤服务器了合适的SSL key,那么在应⽤急启⽤SSL是⾮常容易的。
1
<security-constraint>
2 3 4
<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不能被客户端脚本访问。这帮助减轻了⼀些常见的攻击。就像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允许在l中使⽤供应商特定的useHttpOnly属性来启⽤它。该属性在Tomcat5.5和6中默认是禁⽤的。在Tomcat7中,该属性默认是启⽤的。因此即使你在l中将其设置为false,然后部署在tomcat7中,除⾮你修改了l⽂件,否则你的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>
总结
构建和部署安全的应⽤需要从不同的受益⼈处获取需求。环境和配置和编码⾃⾝⼀样重要。通过思考这些常见的安全错误配置,希望你可以创建更加安全的应⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论