Stimulsoft 報表腳本執(zhí)行模式風險與防護建議
Stimulsoft 是一款專業(yè)的商業(yè)智能報表與數(shù)據(jù)可視化工具套件,廣泛應用于企業(yè)級系統(tǒng)中,用于快速構建交互式報表、儀表盤和數(shù)據(jù)分析界面。其產(chǎn)品支持 .NET、JavaScript、PHP、Java 等多種開發(fā)平臺,幫助開發(fā)者以可視化方式展現(xiàn)復雜數(shù)據(jù),實現(xiàn)靈活的企業(yè)信息展示與決策支持。
近日,Stimulsoft 官方再次提醒開發(fā)者注意在報表加載與腳本執(zhí)行過程中可能存在的安全風險,特別是在使用 “Compilation(編譯)計算模式” 時。
?? 潛在風險說明
當報表的計算模式被設置為 Compilation(編譯)模式 時,在 Web Viewer 中打開報表時可能會執(zhí)行嵌入代碼。這些代碼可能在服務器端被編譯并運行,從而存在遠程執(zhí)行不安全代碼(RCE)的風險。
需要特別說明的是:
Stimulsoft 本身并不存在可被直接利用的內(nèi)置漏洞。
安全風險僅在特定項目配置下出現(xiàn),例如:
報表計算模式設為 Compilation;
應用允許用戶上傳未經(jīng)過驗證的自定義報表文件。
? 官方安全建議
為了最大程度降低風險,Stimulsoft 官方建議開發(fā)者采取以下防護措施:
1. 禁用 Compilation 模式
僅在必要且受信任的環(huán)境下使用 Compilation 模式。
在大多數(shù)情況下,推薦啟用 Interpretation(解釋)模式,該模式不進行即時編譯,從根本上消除了遠程代碼執(zhí)行風險。
可通過以下方式設置:
report.CalculationMode = StiCalculationMode.Interpretation;
或通過全局 Viewer 參數(shù)禁用加載帶 Compilation 模式的報表:
StiOptions.Viewer.AllowOpenDocumentWithCompilation = false;
2. 使用解釋模式腳本
在 Stimulsoft Reports 2025.3 版本中,.NET 平臺已支持在 Interpretation 模式下執(zhí)行 C# 腳本。
開發(fā)者可在腳本中安全使用變量、數(shù)據(jù)列、自定義函數(shù)及基本控制語句(if、else、循環(huán)等),滿足大多數(shù)業(yè)務邏輯需求,同時確保系統(tǒng)安全。
?? 報表上傳安全建議
若應用允許用戶上傳報表文件,請務必:
-
對上傳文件進行結構驗證(如 XML/JSON 內(nèi)容分析);
-
禁止執(zhí)行用戶代碼;
-
在隔離環(huán)境中保存與處理上傳報表;
-
限制系統(tǒng)用戶的文件與數(shù)據(jù)訪問權限。
此外,還可以在前端 Viewer 中通過攔截 “Open” 操作的方式臨時阻止加載未知報表文件。
C#
...
<body>
<form id="form1" runat="server">
<cc2:StiWebViewer runat="server" ID="StiWebViewer1" OnGetReport="StiWebViewer1_GetReport" />
</form>
<script>
jsStiWebViewer1.onready = function () {
jsStiWebViewer1.postAction_ = jsStiWebViewer1.postAction;
jsStiWebViewer1.postAction = function (action, bookmarkPage, bookmarkAnchor, componentGuid) {
if (action == "Open" || action == "OpenDashboard") {
//Write your code here for the "Open"
return;
}
jsStiWebViewer1.postAction_(action, bookmarkPage, bookmarkAnchor, componentGuid);
}
}
</script>
</body>
...
JavaScript:
...
let viewer = new Stimulsoft.Viewer.StiViewer(viewerOptions, "StiViewer", false);
viewer.renderHtml("content");
viewer.jsObject.postAction_ = viewer.jsObject.postAction;
viewer.jsObject.postAction = function (action, bookmarkPage, bookmarkAnchor, componentGuid) {
if (action === "Open" || action === "OpenDashboard") {
//Write your code here for the "Open"
return;
}
viewer.jsObject.postAction_(action, bookmarkPage, bookmarkAnchor, componentGuid);
}
...
?? 開發(fā)者責任與安全邊界
Stimulsoft 提供的編譯與腳本功能是為了滿足靈活的業(yè)務邏輯實現(xiàn)需求,而非默認行為。應用安全性取決于開發(fā)者對環(huán)境配置和功能使用的正確性。
我們再次強調(diào):
-
Stimulsoft 產(chǎn)品不存在可直接利用的安全漏洞;
-
僅當錯誤配置與未過濾的用戶輸入結合時,才可能出現(xiàn)潛在風險;
-
如果出現(xiàn)以下情況,,不建議啟用 Compilation 模式。
- 您不確定為什么需要它,或者您沒有使用它提供的功能;
- 允許用戶上傳自己的報告;
- 沒有額外的過濾或執(zhí)行環(huán)境隔離。
Stimulsoft 為企業(yè)提供強大的數(shù)據(jù)可視化能力,同時也為開發(fā)者預留了靈活的安全配置選項。但是,啟用高級功能(例如編譯模式)時,限制用戶輸入和隔離執(zhí)行環(huán)境的責任由應用程序開發(fā)人員自行承擔。

浙公網(wǎng)安備 33010602011771號