sql server 2005 竞然有个这么弱智的BUG???

mengmou 2007-12-21 04:10:11
CREATE TABLE tmp(a INT,b int)
go
DECLARE @sql VARCHAR(10)

SET @sql = ''

SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid

SELECT @sql
/*
---------
,b

(1 row(s) affected)

*/

SET @sql = ''

SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
--ORDER BY colid
SELECT @sql
/*
----------
,a,b

(1 row(s) affected)


*/
GO
DROP TABLE tmp


...全文
157 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ivyrich 2007-12-22
  • 打赏
  • 举报
回复
请大家关注 SQL Injection

SQL Injection 是一种攻击方法,它可以将恶意代码插入到以后将传递给 SQL Server 供分析和执行的字符串中。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。

SQL Injection 的主要形式包括直接将代码插入与 SQL 命令串联并执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

在帮助中提到如果可能,应拒绝包含以下字符的输入。

输入字符  在 Transact-SQL 中的含义  
;
查询分隔符

'
字符数据字符串分隔符

--
注释分隔符

/* ... */
注释分隔符。服务器不对 /* 和 */ 之间的注释进行处理。

Xp_
目录扩展存储过程的名称的开头,如 xp_cmdshell。



w2jc 2007-12-22
  • 打赏
  • 举报
回复
如果只是

SELECT CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid


那么无论是否有order by,返回都是正确的。
但是使用

@sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name) 就有问题了。

不过我觉得上面这种写法也不是很好。完全依赖于SQL内部怎么处理...
winstonbonaparte 2007-12-21
  • 打赏
  • 举报
回复
我的是SQL 2000
Limpire 2007-12-21
  • 打赏
  • 举报
回复
关注
winstonbonaparte 2007-12-21
  • 打赏
  • 举报
回复

CREATE TABLE tmp(a INT,b int)
go
DECLARE @sql VARCHAR(10)

SET @sql = ''

SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid

SELECT @sql
/*
---------
,a,b

(1 row(s) affected)

*/

SET @sql = ''

SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
--ORDER BY colid
SELECT @sql
/*
----------
,a,b

(1 row(s) affected)


*/
GO
DROP TABLE tmp

我这里的运行结果怎么和LZ的不一样?我这里得到的结果是一样的
hui_hui_2007 2007-12-21
  • 打赏
  • 举报
回复
邹键有一篇文章专门论述这个问题:
http://blog.csdn.net/zjcxc/archive/2006/09/17/1233068.aspx
hui_hui_2007 2007-12-21
  • 打赏
  • 举报
回复
关注。
xiaoku 2007-12-21
  • 打赏
  • 举报
回复
我的是拿 2005 执行 2000的库.
xiaoku 2007-12-21
  • 打赏
  • 举报
回复

----------
,a,b

(1 row(s) affected)


----------
,a,b

(1 row(s) affected)
xiaoku 2007-12-21
  • 打赏
  • 举报
回复
jf
wzy_love_sly 2007-12-21
  • 打赏
  • 举报
回复
改con(var(1))就行,不懂
dobear_0922 2007-12-21
  • 打赏
  • 举报
回复
top 100 percent也没用,top 10000可以,,,
CREATE TABLE tmp(a INT,b int)
go
DECLARE @sql VARCHAR(10)

SET @sql = ''

SELECT TOP 100 percent @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid

SELECT @sql
/*
---------
,b

(1 row(s) affected)

*/

SET @sql = ''

SELECT TOP 10000 @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid
SELECT @sql
/*
----------
,a,b

(1 row(s) affected)


*/
GO
DROP TABLE tmp
dobear_0922 2007-12-21
  • 打赏
  • 举报
回复
ORDER BY的问题据说2000里也有,,,
select top 100 percent...
dawugui 2007-12-21
  • 打赏
  • 举报
回复
看看.

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧