java代码留后门 java代码放在哪里( 七 )


清单 8. 潜在恶意的 Java 代码
public void unusedMethod(){
// code written to harm the system
}
public void usedMethod(){
//unusedMethod(); //code in comment put with bad intentions,
//might affect the system if uncommented
// int x = 100;
// x=x+10;//Code in comment, might affect the
//functionality of the system if uncommented
}
建议
应该将(除启动应用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代码从应用程序代码中除去 。在软件交付使用之前,主要开发人员应该对敏感应用程序进行一次全面的代码评审 。应该使用“Stub”或“dummy”类代替 main() 方法以测试应用程序的功能 。
对付中等严重性暴露的技巧
请遵循下列建议以避免中等严重性静态安全性暴露:
不要依赖初始化
不要通过名称来比较类
不要使用内部类
不要依赖初始化
您可以不运行构造器而分配对象 。这些对象使用起来不安全 , 因为它们不是通过构造器初始化的 。
影响
在初始化时验证对象确保了数据的完整性 。
例如,请想象为客户创建新帐户的 Account 对象 。只有在 Account 期初余额大于 0 时,才可以开设新帐户 。可以在构造器里执行这样的验证 。有些人未执行构造器而创建 Account 对象 , 他可能创建了一个具有一些负值的新帐户,这样会使系统不一致,容易受到进一步的干预 。
建议
在使用对象之前,请检查对象的初始化过程 。要做到这一点,每个类都应该有一个在构造器中设置的私有布尔标志,如清单 9 中的类所示 。在每个非 static 方法中,代码在任何进一步执行之前都应该检查该标志的值 。如果该标志的值为 true,那么控制应该进一步继续;否则,控制应该抛出一个例外并停止执行 。那些从构造器调用的方法将不会检查初始化的变量,因为在调用方法时没有设置标志 。因为这些方法并不检查标志,所以应该将它们声明为 private 以防止用户直接访问它们 。
清单 9. 使用布尔标志以检查初始化过程
public class MyClass{
private boolean initialized = false;
//Other variables
public MyClass (){
//variable initialization
method1();
initialized = true;
}
private void method1(){ //no need to check for initialization variable
//code
}
public void method2(){
try{
if(initialized==true){
//proceed with the business logic
}
else{
throw new Exception("Illegal State Of the object");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
如果对象由逆序列化进行初始化,那么上面讨论的验证机制将难以奏效 , 因为在该过程中并不调用构造器 。在这种情况下 , 类应该实现 ObjectInputValidation 接口:
清单 10. 实现 ObjectInputValidation
interface java.io.ObjectInputValidation {
public void validateObject() throws InvalidObjectException;
}
所有验证都应该在 validateObject() 方法中执行 。对象还必须调用 ObjectInputStream.RegisterValidation() 方法以为逆序列化对象之后的验证进行注册 。RegisterValidation() 的第一个参数是实现 validateObject() 的对象,通常是对对象自身的引用 。注:任何实现 validateObject() 的对象都可能充当对象验证器,但对象通常验证它自己对其它对象的引用 。RegisterValidation() 的第二个参数是一个确定回调顺序的整数优先级 , 优先级数字大的比优先级数字小的先回调 。同一优先级内的回调顺序则不确定 。
当对象已逆序列化时,ObjectInputStream 按照从高到低的优先级顺序调用每个已注册对象上的 validateObject() 。

推荐阅读