本节书摘来异步社区《java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.4节,作者:【美】fred long(弗雷德•朗), dhruv mohindra(德鲁•莫欣达), robert c.seacord(罗伯特 c.西科德), dean f.sutherland(迪恩 f.萨瑟兰), david svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。
当应用程序代码调用安全敏感方法时,必须验证被传递到方法中的参数。特别是,null值可能会被某些特定的安全敏感方法解读为良性参数,导致覆盖程序默认设置。尽管安全敏感方法应该是防御式编码,但是客户端代码也必须验证参数。如果不这样做,就会导致特权升级,可以执行任意代码。
下面的违规代码示例展示了一个双参数方法doprivileged(),它的第二个参数是一个访问控制上下文。这段代码的功能是从以前保存的上下文中恢复特权。
if (accesscontrolcontext == null) {
throw new securityexception("missing accesscontrolcontext");
}
accesscontroller.doprivileged(
new privilegedaction() {
public void run() {
// ...
}
}, accesscontrolcontext);<code>`</code>
必须彻底理解安全敏感方法,并验证它们的参数,以防止意想不到的参数值(如空值)导致的极端情况。如果有意想不到的参数值被传递给安全敏感方法,那么有可能会导致程序可以执行任意代码,还有可能会导致特权升级。