如何解决Sql Injection问题?

时间:2015-03-16 08:40:12

标签: sql sql-server sql-injection

当我尝试使用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帮助我解决了这个问题。

2 个答案:

答案 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/

我希望我帮了一下。