## 2.10 自定義安全管理器
所有模板的本地調用都需要通過安全管理器校驗,默認需要實現NativeSecurityManager 的public boolean permit(String resourceId, Class c, Object target, String method) 方法
如下是Beetl3.17版本后默認的白名單管理器,只允許java.util包的Java調用
```java
public class WhiteListNativeSecurityManager implements NativeSecurityManager {
Pattern callPattern = null;
public WhiteListNativeSecurityManager(){
allow(Arrays.asList("java.util"));
}
@Override
public boolean permit(Object resourceId, Class c, Object target, String method) {
if (c.isArray()) {
// 允許調用,但實際上會在在其后調用中報錯。不歸此處管理
return true;
}
String name = c.getName();
int i = name.lastIndexOf('.');
if (i == -1) {
// 無包名,肯定安全,允許調用
return true;
}
return callPattern.matcher(name).matches();
}
}
```
可以自定義安全管理器,或者調用allow方法添加更多允許的Java調用
```
WhiteListNativeSecurityManager securityManager = new WhiteListNativeSecurityManager();
securityManager.allow(Arrays.asList("java.util","com.mycorp.project.util","com.mycorp.project.constants.Constants));
```
在Beetl3.17版本之前,默認使用的是DefaultNativeSecurityManager,他采用黑名單管理方式,杜絕了目前已知的漏洞(但不保證未來有安全漏洞)如下是默認管理器的實現方法
```java
public class DefaultNativeSecurityManager implements NativeSecurityManager{
@Override
public boolean permit(String resourceId, Class c, Object target, String method){
if (c.isArray()){
//允許調用,但實際上會在在其后調用中報錯。不歸此處管理
return true;
}
String name = c.getSimpleName();
String pkg = c.getPackage().getName();
if (pkg.startsWith("java.lang")){
if (name.equals("Runtime") || name.equals("Process") || name.equals("ProcessBuilder")
|| name.equals("System")){
return false;
}
}
//省略其他安全漏洞屏蔽代碼
return true;
}
}
```
**需要強調的是,當允許在Beetl模板中使用Java本地調用,且使用DefaultNativeSecurityManager,且Beetl的模板編寫權利交給瀏覽器終端用戶,才有可能發生安全漏洞**,這跟Struts框架,Spring框架,JSON工具的漏洞原因是一樣的,但發生幾率相比這些Web框架來說,幾乎不可能,就好比如果把Java編寫編譯的權利交給瀏覽器終端用戶,那Java也有安全漏洞
- Beetl 3 中文文檔
- 第一部分 基礎用法
- 1.1 安裝
- 1.2 快速開始
- 1.3 模板基礎配置
- 1.4 模板加載器
- 1.5 定界符與占位符
- 1.6 注釋
- 1.7 變量定義
- 1.8 屬性
- 1.9 數學表達式
- 1.10 循環語句
- 1.11 條件語句
- 1.12 異常捕獲
- 1.13 虛擬屬性
- 1.14 函數調用
- 1.15 安全輸出(重要)
- 1.16 輸出格式化
- 1.17 標簽
- 1.18 調用Java方法與屬性
- 1.19 嚴格MVC控制
- 1.20 指令
- 1.21 錯誤處理
- 1.22 Beetl小工具
- 1.23 Escape
- 第二部分 高級用法
- 2.1 配置GroupTemplate
- 2.2 自定義方法
- 2.3 自定義格式化函數
- 2.4 自定義標簽
- 2.5 自定義虛擬屬性
- 2.6 使用額外的資源加載器
- 2.7 自定義資源加載器
- 2.8 使用CompositeResourceLoader
- 2.9 自定義錯誤處理器
- 2.10 自定義安全管理器
- 2.11 注冊全局共享變量
- 2.12 自定義布局
- 2.13 性能優化
- 2.14 定制輸出
- 2.15 定制模板引擎
- 2.16 直接運行Beetl腳本
- 2.17 模板校驗
- 第三部分 Web 集成
- 3.1 Web提供的全局變量
- 3.2 集成技術開發指南
- 3.3 Servlet集成
- 3.4 SpringMVC集成
- 3.5 Spring Boot集成
- 3.6 Jodd集成
- 3.7 JFinal4 集成方案
- 3.8 Nutz集成
- 3.9 Struts2集成
- 3.10 整合ajax的局部渲染技術
- 3.11 在頁面輸出錯誤提示信息
- 附錄
- 4.1 內置方法
- 4.2 Spring相關函數
- 4.3 Spring security
- 4.4 shiro
- 4.5 內置格式化方法
- 4.6 內置標簽函數
- 4.7 內置html標簽
- 4.8 性能優化
- 4.9 Eclipse 插件
- 4.10 性能測試對比