如何解决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你能发一些代码吗???那将对我很有帮助。。我已经通过这些链接,在发布这个问题之前。。。