扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:knowsky.com 来源:knowsky.com 2007年9月1日
关键字: 存储过程 SQL Server SQL Server 各版本 数据库
大家可以看到上面的存储过程中是通过一些步骤最终拼接成一个SQL Server字符串,然后通过exec执行这个串得到分页的结果。
我们假定要做一个这样的查询,通过用户名UserName模糊查询用户,为了叙述方便,便于理解我们只考虑取第一页的情况,取出存储过程中取第一页的拼串行如下:
|
为了便于说明问题,我们可以假定@pageSize为20,@strGetFields为 ‘*’,@tblName为UserAccount,@strOrder为’ ORDER BY ID DESC’ 那么上面一行可以写成如下形式:
|
我们可以假定用户输入的模糊用户名是: Jim’s dog。
我们用SQL Parameter传递参数给分页存储过程@strWhere 的值是:’UserName LIKE ‘’%Jim’’ dog%’’’(注意LIKE后边的字符串中的单引号已经全部变成两个单引号了),我们将这个值代入上面的@strSQL赋值语句中,如下:
|
大家可以把上面几行代码粘贴到查询分析器中执行一下,就可以看到下面的画面:
在消息的第一行,打印出了要执行的SQL Server语句,很显然此语句的 LIKE ‘%Jim’ 后面的部分全部被截断了,也就是说如果用户输入的不是Jim’s dog而是Jim’ delete from UserAccount那么会正确的执行删除操作,传说中的SQL Server注入就会出现了。
问题出现了,我们应该怎么解决问题?
1.很显然我们使用SqlParameter传递参数已经将单引号替换成了连个单引号了,可是因为我们在数据库中拼串导致替换并不能解决问题。
2.根据我的实验证明如果使用存储过程不可能解决这个问题,我们只有将这个存储过程要执行的拼串操作放到数据访问层去做,才可以避免这个问题。
备注:本文说的是MS SQL Server2000 的数据库,而非使用SQL Server2005的新特性分页。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者