安全编程-异常处理

一般情况下,程序员没有充分考虑错误条件和异常情况,而是更多地考虑那些期望的情况,这种忽略使得攻击者可以遵循一条错误和异常发生路径来实现攻击。不完善的错误处理机制通常会导致资源泄露。

异常包括已检测的异常和未检测的异常。假如一个方法声明抛出一个已检测的异常,所有调用它的方法就必须处理这个异常或者声明同样也抛出这个异常。这就迫使程序员考虑所有可能会发生已检测异常的地方。未检测异常可以不必声明和处理。

为了避免泄露堆栈记录或者其他系统信息,程序应当声明一个安全的异常处理程序,其功能是处理任何被置于调用堆栈顶部的异常(已检测或未检测的)。

在异常处理中要注意资源泄露问题,未能释放资源(包括数据库对象,文件句柄和套接字)可能会导致严重的性能问题。这种情况通常是在不寻常环境下或系统负荷太重时偶然发生的,所以很难根据生成的错误信息查找到资源泄露的位置。例如java程序中如果在执行SQL或处理结果时出现了异常,那么stmt对象将不能被关闭。假如这种情况经常发生,数据库将耗尽可用的指针,不能执行任何其他的查询。解决方法是在finally模块中调用close(),以保证在各种条件下释放资源。

 

Web应用中不要使用HTTP错误代码发送有关错误的信息。对于导致错误的请求仍然返回200 OK。对于所有未预料到的事件使用一个独立的普通错误响应网页,这些事件包括HTTP错误和未处理的例外。使用一个单独的默认错误响应页可以防范攻击者采集信息,如堆栈追踪或者来自应用程序容器的内部错误响应的其他系统数据。

应用程序配置中应当指定一个默认的错误响应网页来确保应用程序绝不会向攻击者泄露错误信息。除了它是一个良好的安全实践以外,处理标准HTTP错误代码是非常有用的并且是对用户友好的。好的配置也将定义一个最后的错误处理器,它捕获应用程序可能抛出的任何异常。在web.xml中应该包含以下类似的内容:

<error-page>

<exception-type>java.lang.Throwable</exception-type>

<location>/error.jsp</location>

</error-page>

<error-page>

<error-code>404</error-code>

<location>/error.jsp</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/error.jsp</location>

</error-page>

你可能感兴趣的:(编程,异常处理,安全)