1

我在继承的一些代码中遇到了这一点 tsql:

DECLARE @a NVARCHAR(1000) ,
    @b NVARCHAR(4)
SET @b = ( SELECT   RIGHT(CAST(SQL_VARIANT_PROPERTY('#', 'basetype') AS VARCHAR(7)),
                          4)
         )
SET @a = SUBSTRING(object_definition(OBJECT_ID('sys.sp_columns')), 399, 6)
    + ' ' + @b + '(' + REPLACE(REPLACE(REPLACE('^523101239923^42310123^623^5',
                                               '^', '11'), '3',
                                       ' + ' + @b + '('), '2', ')')
    + ') '' '''
EXEC sp_executesql @a 

它将结果“秘密”输出到查询窗口(也许是个玩笑?)。我不知道为什么制作此代码或制作此代码的人。有人可以尝试向我解释它是如何工作的吗?它有什么用,或者我可以把它撕掉吗?

4

2 回答 2

2

这是生成和执行查询的一种非常迂回的方式:

select char(115) + char(101) + char(99) + char(114) + char(101) + char(116) + char(115) ' '

这是另一种写作方式:

select 'secrets' as ' '

它是否有用取决于如何调用此查询 - 是否有可能比应用程序调用它来获取(非常差的)密码或加密密钥?

于 2013-06-18T18:36:01.853 回答
2

稍微给大家分解一下,

select sql_variant_property('#','basetype') = 'varchar'
select right('varchar',4) = 'char'
select object_definition(object_id('sys.sp_columns')) = [sys.sp_colums tsql]
select substring(sys.sp_colums tsql,399,6) = 'select'

所以:

@a = 'select select char(115) + char(101) + char(99) + char(114) + char(101) + char(116) + char(115) ' ''

exec sp_executesql @a  = 'secrets'

这基本上是一个人有一些额外的时间在他们手上并且想要使事情变得过于复杂的情况。大概是觉得好笑吧。

我希望它没有被使用。

于 2013-06-18T18:48:40.950 回答