当前位置:首页 » 编程语言 » 报表sql

报表sql

发布时间: 2022-12-21 09:22:58

‘壹’ 如何解决报表的 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

热点内容
安卓如何关闭单应用音量 发布:2025-05-15 11:22:31 浏览:350
抖音电脑后台服务器中断 发布:2025-05-15 11:11:59 浏览:307
sql2008服务器 发布:2025-05-15 11:03:27 浏览:306
我的世界pe服务器创造 发布:2025-05-15 10:51:17 浏览:608
移动端打吃鸡要什么配置 发布:2025-05-15 10:48:16 浏览:756
我的世界哪五个服务器被炸了 发布:2025-05-15 10:36:16 浏览:994
ehcache存储对象 发布:2025-05-15 10:35:31 浏览:528
搭建虚拟电脑的服务器 发布:2025-05-15 10:29:31 浏览:270
湖人双核配置哪个最好 发布:2025-05-15 10:09:48 浏览:980
手机热点密码怎么查看 发布:2025-05-15 09:54:47 浏览:109