所有的報表工具都會提供引數功能,主要都是用於根據使用者輸入的查詢條件來選取合適的資料。比如希望查詢指定時間段的資料,就可以把時間段作為引數傳遞給報表,報表在從資料庫中取數時將這些引數應用到取數 sql 的 where 條件上,就可以根據不同引數取出不同資料來呈現了。不過,這樣做要求事先把查詢條件的規格做死,比如按時間段查詢,那就要事先把 where 寫成 date>=? and date<=? 的形式。這時候,如果想用地區查詢就不行了,還得再造乙個形如 area=? 的查詢條件或報表。顯然,這非常麻煩!
於是,通用查詢出現了。報表工具提供一種特殊的字串型引數,允許將其應用於替換 sql 的某一部分,比如 where 子句。介面端根據使用者輸入拼出合法的 sql 條件串,作為引數傳遞給報表替換現有 sql 的 where 子句,這樣就可以在同一張報表上實現不同形式的查詢條件了。比如 sql 可以寫成
select … from t where$
其中 $ 就是將來會被引數 w 替換的內容。按時間段查詢時,可以把 w 拼成 date>… and data <=…,按地區查詢時則拼成 area=…。當然也可以混合多條件查詢拼成 data>… and date<=… and area=…。無條件時則拼成乙個永遠為真的條件 1=1。顯然,這非常靈活了。
但是,這樣做會帶來嚴重的安全隱患。
討論安全問題時,我們要假定前端沒有任何安全性可言,也就是前端很可能被黑客劫持而送入任何可能的引數進來。假如,黑客把上面的 w 拼成
1=0 union select … from user
送進來。現在整個 sql 語句就變成
select … from t where1=0 union select … from user
這是一句可執行的合法 sql,user 表中的資訊就被洩露了。
怎麼補救呢?我們可以把原始 sql 的條件上加上括號,寫成
select … from t where ($)
的形式。正常的條件串傳進來仍然是合法可執行的,而剛才那個攻擊串傳進來之後,sql 將變成:
select … from t where (1=0 union select … from user)
這是一句非法的 sql,會被資料庫拒絕,風險似乎就沒有了。
且慢,如果黑客把 w 拼成
1=0) union select … from user where (1=1
整句 sql 將變成
select … from t where (1=0) union select … from user where (1=1)
還是一句可執行的合法 sql,仍然會洩露資訊。
原則上,我們要假定最壞情況,要保證黑客即使知道資料庫結構和報表 sql 寫法時,仍然無法攻擊。
我們只能把這個 sql 寫得更複雜一些:
select … from t where ($) or$
正常的條件串仍然還是合法可執行的,攻擊串送進來會變成:
select … from t where (1=0) union select … from user where (1=1) or1=0) union select … from user where (1=1
這就非法了,可以擋住這個攻擊。
這個寫法是不是能擋住所有的 sql 植入攻擊,我沒有仔細證明過,試了很多可能的攻擊都沒問題,有興趣的讀者可以再嘗試一下。
無論如何,這個 sql 已經有點複雜了,而且 sql 寫成這樣,執行效率也會受到影響,條件有時候會被執行兩次(當 w 為假時,第二遍 w 會沒必要地再計算一次)。但為了安全性,卻沒有什麼好辦法。
這個例子說明,想擋住 sql 植入攻擊並不是非常輕鬆的事情。這還只是把替換子句用在 where 的部分,有時為了靈活選出字段,還可能把替換子句用到 select 甚至 from 部分,情況就更為複雜。我想,對於相當多對安全意識還不夠強的報表開發人員來講,想到這些並且避免都不是一件容易的事,但又是一件非常重要的事。
從這個意義上講,使用傳統的引數方案(本文開頭的說法)在有些時候還是相當必要的,這種方案下只能執行固定的 sql,不可能被植入,雖然條件方面不夠靈活,但安全性可靠得多。有個別報表工具為了簡單靈活而只提供了子句替換的方案,在選型考察時要特別加以注意,畢竟報表開發人員很可能會忽略這個問題,而這種安全漏洞又不是很容易被測試出來的,但一旦發生的後果都會很嚴重。
還有個辦法是由報表工具提供敏感詞檢查,當傳進來的替換子句包含某些特定詞的時候將被拒絕掉,比如很少有人會用 select,from 這些 sql 關鍵字作為欄位名,那麼,我們判斷一下如果替換子句中包含有 select,from 這些詞時,就認為受到攻擊並拒絕執行。這樣做會犧牲一點靈活性,有時傳進來的子句真的會含有這些關鍵字,比如拼入 select 或 from 部分的子句,不過這種情況相對少見,損失不大,但獲得了較好的安全性。
SAP BO 報表工具
隨著大資料時代的來臨,bi分析工具也熱火朝天的發展起來。由於一直在做sap的bi產品,所以主要圍繞著sap bo提供的報表工具做乙個簡單的選型介紹。目前sap bo提供了下列元件供我們選擇 crystal report 固定格式報表,財務三大表的優秀載體,但是不支援即席查詢。web intellig...
報表工具的奧秘
也許三個月之後,我就要從前台客服,搖身一變進入db組了。說白了,erp系統本來就是我的老本行。從今天起,記錄二廠gamma系統的特有的方方面面 如果有必要的話。甚至更有甚者,連路徑後面中括號裡面的內容全部沒有,直接就是 設定路徑找不到報表,請檢查 讓你百做不得其解。報表的許可權?設定了啊!報表資料夾...
商務智慧型報表工具
商務智慧型 bi 解決方案 artm report 是乙個b s 方式的基於 olap 的多維資料集展現工具。能夠提供給使用者乙個靈活的報表定義和資料分析平台,為使用者提供豐富的資料展現形式和強大的資料分析功能。artm report 能夠讓使用者在客戶端輕鬆地訪問 分析 sql server an...