在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如果你觉得我错了,请读下去也许你会改变看法。
通常大家都会认为存储过程可以避免sql注入的漏洞,这适用于一般的存储过程,而对于通用分页存储过程是不适合的,请看下面的代码和分析!
一般的通用的分页存储过程代码如下:
复制代码 代码如下:
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
GO
大家可以看到上面的存储过程中是通过一些步骤最终拼接成一个sql字符串,然后通过exec执行这个串得到分页的结果。
我们假定要做一个这样的查询,通过用户名UserName模糊查询用户,为了叙述方便,便于理解我们只考虑取第一页的情况,取出存储过程中取第一页的拼串行如下:
set @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
为了便于说明问题,我们可以假定@pageSize为20,@strGetFields为 ‘*',@tblName为UserAccount,@strOrder为' ORDER BY ID DESC' 那么上面一行可以写成如下形式:
set @strSQL = 'SELECT TOP 20 * from [UserAccount] where ' + @strWhere + ' ORDER BY ID DESC'
我们可以假定用户输入的模糊用户名是: Jim's dog
我们用SqlParameter传递参数给分页存储过程@strWhere 的值是:'UserName LIKE ‘'%Jim'' dog%'''(注意LIKE后边的字符串中的单引号已经全部变成两个单引号了),我们将这个值代入上面的@strSQL赋值语句中,如下:
set @strSQL = 'SELECT TOP 20 * from [UserAccount] where UserName LIKE ''%Jim'' dog%'' ORDER BY ID DESC'
让我们写上声明变量的部分执行在查询分析器中测试一下,代码如下:
复制代码 代码如下:
DECLARE @strSQL varchar(8000)
DECLARE @strWhere varchar(1000)
SET @strWhere = 'UserName LIKE ''%Jim'' dog%'''
set @strSQL = 'SELECT TOP 20 * from [UserAccount] where ' + @strWhere + ' ORDER BY ID DESC'
print @strSQL
exec (@strSQL)
大家可以把上面几行代码粘贴到查询分析器中执行一下,就可以看到下面的画面:
在消息的第一行,打印出了要执行的sql语句,很显然此语句的 LIKE ‘%Jim' 后面的部分全部被截断了,也就是说如果用户输入的不是Jim's dog而是Jim' delete from UserAccount那么会正确的执行删除操作,传说中的sql注入就会出现了。
问题出现了,我们应该怎么解决问题?
1. 很显然我们使用SqlParameter传递参数已经将单引号替换成了连个单引号了,可是因为我们在数据库中拼串导致替换并不能解决问题。
2. 根据我的实验证明如果使用存储过程不可能解决这个问题,我们只有将这个存储过程要执行的拼串操作放到数据访问层去做,才可以避免这个问题。
如果大家有在存储过程中解决这个问题的办法,请不吝赐教。
备注:本文说的是MS SQL Server2000 的数据库,而非使用SQL 2005的新特性分页。
相关推荐:
ChatGPT怎么打不开了?揭秘背后的原因与解决方法,ai中打开ai文件丢失
什么是SEO金融,seo是做什么的 ,ai中转程序
seo需要干什么,seo需要具备什么知识 ,ai梦境档案世岛大宅
ChatGPT异常了:人工智能的极限与突破,ai and ethics
SEO北京:数字时代,企业成功的关键,湖南网站建设湖南岚鸿
ChatGPT使用问题?如果您正在使用VPN,请尝试将其关闭,ai制作渐变立体
什么是seo在线咨询,什么是seo在线咨询服务 ,unreal ai
ChatGPT内部HTTP接口文档-为开发者提供高效便捷的AI服务接入方式,安屿ai
SEO对策:提升网站排名与流量的必备策略,SEO入门相机平价学生
SEO优化攻略:如何通过精准策略提升网站排名与流量,aI ow翻译
SEO优化工具优势:提升网站排名,带来流量和转化的秘密武器,ai圆形造字
seo要懂些什么,seo主要做什么的 ,小艾艾AI
SEO舆情:如何通过有效的舆情管理提升企业品牌形象,seo推广外包提高收录
优化软件:让电脑性能焕然一新,提升效率的秘密武器,大理网站推广招聘信息最新
seo链接有什么用,seo外链是什么意思 ,one ai写作
ChatGPT显示“此网站无法加载站点”:背后原因与解决办法详解,用ai画明度渐变条
ChatGPT3.5需要登录使用吗?AI使用的真相!,电脑版写作ai推荐怎么关闭
SEO培训:助力企业实现互联网营销的无限可能,平塘网站优化推广价格
SEO关键词推广软件官网-助力企业实现高效精准的网络营销,圈圈ai
自动写文章AI:高效创作工具,开启写作新纪元
SEO导流:如何通过精准优化实现网站流量大爆发,网站优化优化怎么做
什么是SEO可以自学吗,seo零基础可以自学吗 ,ai1紫
ChatGPT支持多种语言输入输出,让全球资讯触手可及,联想拯救者的ai写作
ChatGPT登录界面都不显示了?可能是这些原因导致的!,上海小学ai智能课
ChatGLM不能搜索网页内容,你真的了解它的局限性吗?,ai修复情侣
SEO但是,这些常见误区你真的知道吗?,凤岗网站建设开发
亚马逊中什么是seo,亚马逊sop ,ai临摹中国名画
企业如何借助SEO咨询实现精准流量引爆,助力业绩提升,立刻推广的旅游线下营销
SEO利用:让你的网站快速登顶,获取更多流量与客户!,延边小程序推广平台网站
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
优化提长:让企业效能提升的秘密武器,长沙网站建设创意
seo经理做什么的,seo经理招聘 ,盲人ai眼镜
ChatGPT页面不自动显示最新消息:如何解决这一困扰,提升使用体验?,斑马ai幼儿百度云网盘
用AI写的文章算原创吗?真相揭示,带你深度思考!
SEO技术如何通过优化提升网站流量与排名,四平网站优化公司
SEO注意事项:助力网站流量提升的关键策略,济宁快速seo优化价格
SEO总结:如何通过优化提升网站排名与流量,关键词排名消失
seo网站关键字排名优化,网站seo关键词 ,运动ai
SEO优化知识全解析:提升网站排名的秘密武器,ai出错合集
AI人工智能:改变未来的科技革命
ChatGPT+维护页面:您的智能助手之旅,安全、高效、无忧,奥特曼画图ai
ChatGPT一经发布,便受到了用户的狂热追捧,引爆人工智能热潮,十代ai达人办公本
seo链接锚是什么,什么是锚链接,如何设置锚链接 ,保山智能AI
【BVIP尊享体验:超越奢华,开启专属未来】,珠宝网站建设思路
SEO学费多少钱?揭秘SEO培训的投资价值与回报!,郴州网站推广多少钱一个
优化文字,让表达更精准:提升写作效率的关键,个人网站建设外包
SEO提供:如何通过精准的SEO策略提升网站流量与品牌影响力,刷关键词排名立的火星
SEO获取流量的必杀技:如何通过优化轻松提升网站排名,德州全网营销推广价格
SEO好吗?助力网站成功的关键之道,网站优化方案范文怎么写
seo算是什么营销方式,seo是网络营销吗 ,ai318