報表sql
『壹』 如何解決報表的 sql 植入風險
SQL 注入或者 SQL 植入是 WEB 應用程序與資料庫交互過程中,由於對用戶輸入數據的合法性、規范性檢測做的不嚴而導致的一種常見的漏洞,這種漏洞如果被攻擊者加以利用,在查詢語句的結尾添加非法的 SQL 語句,就能進行非法的查詢,會導致數據泄露,風險很大
報表應用作為一個 WEB 應用,同樣會面臨這樣的風險
為了解決普通參數查詢不靈活,不自由的問題,很多報表工具開放了動態拼 SQL 的功能,允許 SQL 中進行子句替換,類似這樣:
SELECT … FROM T WHERE ${w}
w 就是可以根據用戶需求隨意拼的,比如 data>… AND date<=… AND area=…
這樣查詢就靈活多了,但是風險也就來了,這個 w 就會有 SQL 注入的隱患,比如:
SELECT … FROM T WHERE 1=0 UNION SELECT … FROM user
這是一句可執行的合法 SQL,但 user 表中的信息就被泄露了
怎麼樣解決這個問題呢?
1 盡量使用普通的 SQL 參數,不要動態拼 SQL
這樣做,雖然靈活度差一點,但安全
有些報表工具不支持普通 SQL 參數,只提供拼 SQL 的方案,方便是方便了,但就要小心了
2 需要通用查詢時,寫復雜一點的 SQL
比如:
SELECT … FROM T WHERE (${w})
SELECT … FROM T WHERE (${w}) OR ${w}
這樣做有一定的效果,但是並不完美,有些時候也防不住,而且 SQL 復雜後,會影響執行效率
3 再檢查關鍵字
通常通用查詢的條件不會有這些 select,from 等關鍵字,所以可以通過過濾這些關鍵字來防範風險,不讓參數中有這些關鍵字的 SQL 執行,雖然這樣做有時候會失去一些靈活性,但是安全性卻更高了
潤乾報表把這些都做好了,直接用就可以了
我們就以潤乾報表為例,來簡單看一下實現步驟
部署潤乾報表後,在應用目錄下找到 **raqsoftConfig.xml ** 文件,配置敏感詞列表
屬性名:disallowedParamWordList,value 為禁用敏感詞列表,多個之間用逗號分隔,英文字母不區分大小寫
配置列表以後,如果訪問的 URL 中再出現敏感詞,就會提示出錯了,減少風險的發生
http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=a.rpx&arg2= 華北 union select * from users
是的就這么簡單,在一個已經提供了防止 SQL 注入的工具中,就是這么輕松一步設置就可以規避風險了,所以選型的時候,多問問,看看各廠商是否能解決這問題,怎麼解決的,否則就得自己去費勁去修補這個漏洞了
更詳細的操作以及其他解決方式請參考: 報表的 SQL 植入風險及規避方法 - 乾學院
『貳』 報表開發就是寫sql嗎
SQL是報表開發的一部分。報表是把數據進行可視化,你需要設計報表的樣式,包括數據展現、整體布局、圖表配色等等。
報表其實就相當於做產品,我們目的是要讓用戶(業務、領導)滿意,願意看,願意用。
同時,做好報表一定要懂業務,業務知識的掌握往往就成為了報表人能力的分水嶺。
做報表是需要動腦的,SQL只是需要掌握最基礎的。
『叄』 SQL開發報表設置查詢條件
SQL 語句只是對資料庫進行操作,與用戶的交互操作很少,比如窗口、按鈕、下拉菜單等等控制項。
所以資料庫應用程序開發,還需要一門程序數據語言配合資料庫開發。比如C++,PB等等。
『肆』 sqlserver 統計報表的 sql語句怎麼寫
--動態語句
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'],[','')+NAMEfromT_CSDN_ONEgroupbyNAME
set@sql='['+@sql+']'
EXEC('select*from(select*fromT_CSDN_ONE)apivot(SUM(ISNULL(MONERY,0)forNAMEin('+@sql+'))b')
『伍』 水晶報表中的sql表達式欄位怎麼用
水晶報表中的sql表達式欄位有點和sql語句中的別名欄位差不多。
舉個例子先:Select f1,f2,f3,(f4+f5) as xx from table1
那麼sql表達式欄位可以是f1,f2,f3或者是f4+f5
在運用sql表達式欄位的時候,首先需要了解報表當前使用的sql語句,然後select*,([sql表達式欄位]裡面的內容)from table1執行成功。
『陸』 如何運用SQL進行雙向表頭報表查詢
可以先將原始數據按照存款的區間和類別進行一次分組:SELECT TYPE, CASE WHEN BAL < 50000 THEN '5萬元以下'WHEN BAL BETWEEN 50001 AND 100000 THEN '5-10萬'WHEN BAL BETWEEN 100001 AND 200000 THEN '10-20萬'WHEN BAL BETWEEN 200001 AND 300000 THEN '20-30萬'WHEN BAL BETWEEN 300001 AND 400000 THEN '30-40萬'WHEN BAL BETWEEN 400001 AND 500000 THEN '40-50萬'WHEN BAL > 500000 THEN '50萬以上'END AS BAL_RANGE,BAL, AGE, COUNT(*) COUNT_B FROM C_CUST_AGE WHERE DEPT_ID = ? AND TYPE = ? GROUP BY TYPE, AGE, BAL
『柒』 用SQL查詢報表
#我看了你的描述,也沒給出表與表之間的關系和欄位,以我的理解後,寫出以下sql語句,經過測試,可以執行成功
#FeeTable:生活費表包含(學生信息表)也就是外鍵
#Student:學生信息表包含(班級信息表)也就是外鍵
#Greade:班級信息表
select
s.nameas學生名稱,
g.nameas班級名稱,
s.genderas學生性別,
s.teacheras招生老師,
f.liveFeeDateas生活費日期,
f.liveFeeas生活費,
f.sleepFeeDateas住宿費日期,
f.sleepFeeas住宿費,
fareFeeDateas校車費日期,
fareFeeas校車費,
(f.liveFee+f.sleepFee+fareFee)as費用合計
.id=f.studentinnerjoinGreadegons.greade=g.id
groupbys.name,g.name,s.gender,s.teacher,f.liveFeeDate,f.liveFee,f.sleepFeeDate,f.sleepFee,fareFeeDate,fareFee
以上SQL語句要結合你的表結構來適當調整表名、欄位、和關聯。
希望能幫到你!
『捌』 如何用SQL來製作報表
你用數據窗口製作一個簡單報表之後,然後點SQL,design->convert to
就可以看見腳本;然後用SQL自己製作
『玖』 用sql 實現報表查詢
select sales.a,sales.b - inbuy.b - cost1.b - cost2.b
from
(select date as a,sum(銷售額) as b from 銷售表 where date between 開始日期 and 結束日期 group by date ) as sales,
(select date as a,sum(進貨額) as b from 進貨表 where date between 開始日期 and 結束日期 group by date) as inbuy,
(select date as a,sum(支出額) as b from 企業支出費用表 where date between 開始日期 and 結束日期 group by date) as cost1,
(select date as a,sum(費用額) as b from 其他費用表 where date between 開始日期 and 結束日期 group by date) as cost2
where
sales.a = inbuy.a and
sales.a = cost1.a and
sales.a = cost2.a
『拾』 SQL 統計報表
-- create sample table
create table tab1 (id int, output_style char(1), amount int, output_date date);
insert into tab1 values(1,'D',1000,'2009-11-12');
insert into tab1 values(2,'C',1000,'2009-11-12');
insert into tab1 values(3,'G',1000,'2009-12-12');
insert into tab1 values(4,'Z',1000,'2010-01-01');
insert into tab1 values(5,'D',1300,'2009-11-12');
insert into tab1 values(6,'C',1400,'2009-11-12');
insert into tab1 values(7,'G',2000,'2009-12-12');
insert into tab1 values(8,'Z',1000,'2010-01-01');
-- query
select concat(year(output_date), month(output_date)) as yearmonth,
sum(case when output_style='C' then amount else 0 end) as C_Amount,
sum(case when output_style='G' then amount else 0 end) as G_Amount,
sum(case when output_style='Z' then amount else 0 end) as Z_Amount,
sum(case when output_style='D' then amount else 0 end) as D_Amount from tab1 group by output_date