设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1293|回复: 0

Sql Server 集合防黑办法

[复制链接]

32

主题

313

金钱

473

积分

入门用户

发表于 2019-7-10 14:06:16 | 显示全部楼层 |阅读模式

Sql Server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件查询一个集合基本上多数据查询的必备项目.

eg:  select * from tablenmae where id in('A','B','C')

而在程序中直接进行SQL语句拼合则是:

string twhere="'A','B','C'";

string sql_str=”select *from tablename where id in(“+ twhere+”)”;

然后直接执行sql_str返回TABLE或list. 但这样虽然简单,但存在一个注入的风险...那我们可以怎么进行处理减低能预见的风险呢.,答案是通过Sql Server 自带的函数将传入的集合进行过滤,当然你说程序序中过滤也行,但效率没Sql Server快. 好下面就是这个SQL函数:
  1. create Function StrToTable(@str varchar(1000))
  2. Returns @tableName Table
  3. (
  4. str2table varchar(50)
  5. )
  6. As
  7. –该函数用于把一个用逗号分隔的多个数据字符串变成一个表的一列,例如字符串’1,2,3,4,5’ 将编程一个表,这个表
  8. Begin
  9. set @str = @str+’,’
  10. Declare @insertStr varchar(50) –截取后的第一个字符串
  11. Declare @newstr varchar(1000) –截取第一个字符串后剩余的字符串
  12. set @insertStr = left(@str,charindex(‘,’,@str)-1)
  13. set @newstr = stuff(@str,1,charindex(‘,’,@str),”)
  14. Insert @tableName Values(@insertStr)
  15. while(len(@newstr)>0)
  16. begin
  17. set @insertStr = left(@newstr,charindex(‘,’,@newstr)-1)
  18. Insert @tableName Values(@insertStr)
  19. set @newstr = stuff(@newstr,1,charindex(‘,’,@newstr),”)
  20. end
  21. Return
  22. End
复制代码


例子:
  1. declare str vchar(100); --定义str变量
  2. set str=’1,2,3’; --给变量赋值
  3. select * from tablename where id in (select str2table from StrToTable(@str) )
复制代码


分析:
A.select str2tablefrom StrToTable(1,2,3) --调用函数StrToTable(1,2,3),执行出来的结果就是由逗号“,”分割的一个字符串(1,2,3),转换为一个字段的表结果集)

最后:附一个实际项目sql例子
  1. declare @str varchar(1000)  --定义变量

  2. select @str=hylb from [dbo].[f_qyjbxx] where qyid = ${qyid} --给变量赋值

  3. select xsqxtbzd+','
  4. from [dbo].[d_hylb]
  5. where hylbid in (select str2table from strtotable(@str))  --调用函数
  6.       for xml path('');  --将查询结果集以XML形式展现(将结果集以某种形式关联成一个字符串)
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表