沙箱机制说明

TPP运行时沙箱机制说明对代码行为的限制。

Java 安全沙箱

安全沙箱(Security Manager)是 Java 平台提供的, 保护特定系统组件和高权限信息接口的保护措施, 当代码访问受限接口时, 会触发 Security manager checkPermission , 如果判定调用来源(caller class)所拥有的权限不满足当前接口的要求, 会抛出异常中断调用, 从而保护 JVM 安全。

对代码行为的限制

TPP 平台对用户代码采用沙箱机制, 限制了部分高危行为。 包括不限于

  • System.getEnv(禁止获取系统变量)

  • System.getProperties(禁止遍历获取所有系统属性)

  • System.getProperty() 获取系统属性(部分允许, 后续文章中更新提供)

  • new File("/etc/xxx.conf") 读取文件

  • createClassloader 创建自定义类加载器

因此对用户代码需要避免依赖反射,类加载器,本地文件,环境变量属性, 否则执行过程中会触发沙箱检查, 导致执行异常。

例如以下代码, 会因为访问了受限系统接口, 导致执行中抛异常。

class Demo1 {
    
    public void run() {
        
        System.exit();
        
        System.getProperties();
        
        System.getProperty("xxx.xxx");
        
    }
}

正确地使用TPP官方SDK

平台内置的 SDK, 包含部分 client, 直接通过 new 创建实例会触发安全检查。

正确方式, 调用 SDK 中的 client 创建接口, 获得初始化完毕, 可用的 client , 在安全沙箱中正常使用。

注:以下 client 代码是示意, 具体 client ,请 参考具体 client 文档。

class Demo2 {
    
    public void run() {
        
        EasClient = new SDKEasClient(); // 直接访问了特殊接口, 触发沙箱检查, 抛出异常.
        
        PluginServiceProvider.getInstace().newSDKEasClient(); //平台 sdk 提供初始化的接口, 执行成功
        
    }
}