如何解决Sql注入问题?

如何解决Sql注入问题?,sql,sql-server,sql-injection,Sql,Sql Server,Sql Injection,当我尝试以登录名作为'DROP TABLE Test--'创建新登录名时,它将删除测试表 IF OBJECT_ID ('Test') IS NULL CREATE TABLE [dbo].[test]( [Id] [int] NOT NULL ) ON [PRIMARY] GO DECLARE @SQL nvarchar(max)

当我尝试以
登录名
作为
'DROP TABLE Test--'
创建新登录名时,它将删除
测试表

    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的整个
测试表

    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);
预期结果: 仅创建登录名

你能帮我解决这个问题吗

更新:

我已经用
QUOTENAME(大写(@UserCode),“”)解决了这个问题


帮助我解决了这个问题。

根据SQL的版本/类型,您可以使用诸如字符串卫生或之类的工具。

参见此示例

 exec sp_prepexec @p1 output,N'@P1 varchar(22)',N'Select City, State from dbo.ZipCodes where zipcode = @P1','''; Drop Table Test; --'
由于它将恶意代码作为变量接收,服务器只需在表中查找该值并返回一个空结果集。恶意字符串永远不会执行,因此测试表永远不会被删除

因为我不能评论@signs,所以我在这里展示它。 有关详细信息,请参阅此链接


希望我能帮上一点忙。

你用的是什么语言?答案很可能取决于这一点。正如您所演示的,如果您在SQL中使用原始登录,您将面临SQL注入的风险。为什么除了DBA之外的任何人都会创建新的数据库用户?这是用于某种管理面板的吗?即使是这样,人们难道不会破坏他们自己的数据库吗(这不是真正的攻击,即使他们使用注入攻击自己的脚)?编写简单的Sql查询。。。如示例所示…@Thilo问题不在
QUOTENAME(@UserCode)
内,而是在
UPPER(@UserCode)
内。。。给你一个关于这个话题的介绍,以及如何用不同的语言来处理这个问题。这个问题太平淡了,以至于这是目前任何人都能给出的最好的答案。不是真的。不能对架构对象名称(例如用户名)使用绑定变量。QUOTENAME不是已经算作“字符串卫生设施”了吗?同意。你有我的+1你能发一些代码吗???那将对我很有帮助。。我已经通过这些链接,在发布这个问题之前。。。