《Java编码指南:编写安全可靠程序的75条建议》—— 指南4:确保安全敏感方法被调用时参数经过验证

本节书摘来异步社区《Java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.4节,作者:【美】Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达), Robert C.Seacord(罗伯特 C.西科德), Dean F.Sutherland(迪恩 F.萨瑟兰), David Svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。

指南4:确保安全敏感方法被调用时参数经过验证

当应用程序代码调用安全敏感方法时,必须验证被传递到方法中的参数。特别是,null值可能会被某些特定的安全敏感方法解读为良性参数,导致覆盖程序默认设置。尽管安全敏感方法应该是防御式编码,但是客户端代码也必须验证参数。如果不这样做,就会导致特权升级,可以执行任意代码。

违规代码示例

下面的违规代码示例展示了一个双参数方法doPrivileged(),它的第二个参数是一个访问控制上下文。这段代码的功能是从以前保存的上下文中恢复特权。

AccessController.doPrivileged(
 new PrivilegedAction<Void>() {
  public Void run() {
   // ...
  }
 }, accessControlContext);```
当传入空的(null)访问控制上下文时,双参数方法doPrivileged()不能仅对之前保存的上下文进行授权。因此,当accessControlContext参数为null时,这段代码可能会导致过度授权。如果程序员打算以一个空的访问控制上下文调用AccessController.doPrivileged()方法,那么必须显式传递一个null参数或使用单参数版本的AccessController.doPrivileged()方法。

####合规解决方案
下面的合规解决方案通过确保accessControlContext不为空,阻止了程序的过度授权。

if (accessControlContext == null) {
 throw new SecurityException("Missing AccessControlContext");
}
AccessController.doPrivileged(
 new PrivilegedAction() {
  public Void run() {
   // ...
  }
 }, accessControlContext);`

适用性

必须彻底理解安全敏感方法,并验证它们的参数,以防止意想不到的参数值(如空值)导致的极端情况。如果有意想不到的参数值被传递给安全敏感方法,那么有可能会导致程序可以执行任意代码,还有可能会导致特权升级。

上一篇:微信支付-b


下一篇:MySQL数据备份语句