当我尝试使用Login Name
作为'DROP TABLE Test --'
创建新登录时,它将会丢弃Test Table
。
IF OBJECT_ID ('Test') IS NULL
CREATE TABLE [dbo].[test](
[Id] [int] NOT NULL
) ON [PRIMARY]
GO
DECLARE @SQL nvarchar(max)
DECLARE @UserCode nvarchar(50)
SELECT @UserCode = N'''DROP TABLE Test --';
SET @SQL = N'CREATE LOGIN '+ QUOTENAME(@UserCode) +' WITH PASSWORD = ''' + UPPER(@UserCode) + '''';
EXECUTE(@SQL);
当前结果:
创建新登录以及Drop的整个Test Table
。
预期结果 仅创建登录。
你能帮我解决这个问题吗?
更新:
我已使用QUOTENAME(UPPER(@UserCode), '''')
...
This thread帮助我解决了这个问题。
答案 0 :(得分:1)
根据SQL的版本/类型,您可以使用prepared statements,字符串清洁或stored procedures等工具。
答案 1 :(得分:1)
见这个例子......
exec sp_prepexec @p1 output,N'@P1 varchar(22)',N'Select City, State from dbo.ZipCodes where zipcode = @P1','''; Drop Table Test; --'
由于它将恶意代码作为变量接收,因此服务器只需查找表中的值并返回空白结果集。永远不会执行恶意字符串,因此永远不会删除测试表。
因为我不能评论@标志,所以我在这里展示。 请参阅此链接了解详情。 https://www.simple-talk.com/sql/learn-sql-server/sql-injection-defense-in-depth/
我希望我帮了一下。