Sql sp_可预见的滥用(需要修改)

Sql sp_可预见的滥用(需要修改),sql,sql-server,sql-injection,code-injection,sp-msforeachtable,Sql,Sql Server,Sql Injection,Code Injection,Sp Msforeachtable,最近有人用sp\MSforeachtable侵入了我们的数据库,所以如果我是对的,可以进行多行查询 现在我的问题是如何修改sys.sp\MSforeachtable,他正在使用@command1和其他命令执行查询,以便删除我们的表。 然后,我的SQL分析器显示: 有人能告诉我如何保护这些东西吗?SQL Profiler向我显示应用程序名为PHP5,因此可能是注册页面或登录面板注入。您的网站用于连接数据库的用户访问权限过多,请将其降至最低,安全性例外!好的,我现在已经创建了一个新用户,我应该授

最近有人用
sp\MSforeachtable
侵入了我们的数据库,所以如果我是对的,可以进行多行查询

现在我的问题是如何修改sys.sp\MSforeachtable,他正在使用
@command1
和其他命令执行查询,以便删除我们的表。

然后,我的SQL分析器显示:


有人能告诉我如何保护这些东西吗?SQL Profiler向我显示应用程序名为PHP5,因此可能是注册页面或登录面板注入。

您的网站用于连接数据库的用户访问权限过多,请将其降至最低,安全性例外!好的,我现在已经创建了一个新用户,我应该授予它什么权限?数据读取器和数据写入器?这给了网站什么权限?可以肯定的是,用户不会在网站上使用DROP/DELETE命令。你在互联网上搜索过“SQL注入”吗?你是一个受害者,你需要赋予自己知识来停止成为受害者…我可以向你保证,我们的反SQL方法非常好,唯一的问题是我们遇到了一些SQL黑客,1.5年后,这是第一个如此先进的SQL注入,其他运行同一系统的公司不知道它来自何处,泄漏在何处。
XXXX=Censored db name
(Somehow also spaces in front of the USE)
 USE XXXX;  
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";
EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
select @mscat = ltrim(str(convert(int, 0x0002)))

exec(N'declare hCForEachTable cursor global for select ''['' + REPLACE(schema_name(syso.schema_id), N'']'', N'']]'') + '']'' + ''.'' + ''['' + REPLACE(object_name(o.id), N'']'', N'']]'') + '']'' from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id '
         + N' where OBJECTPROPERTY(o.id, N''IsUserTable'') = 1 ' + N' and o.category & ' + @mscat + N' = 0 '
         + @whereand)

declare hCForEachTable cursor global for select '[' + REPLACE(schema_name(syso.schema_id), N']', N']]') + ']' + '.' + '[' + REPLACE(object_name(o.id), N']', N']]') + ']' from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id  where OBJECTPROPERTY(o.id, N'IsUserTable') = 1  and o.category & 2 = 0 

exec @retval = sys.sp_MSforeach_worker @command1, @replacechar, @command2, @command3, 0

create table #qtemp (   /* Temp command storage */
                qnum                int             NOT NULL,
                qchar               nvarchar(2000)  COLLATE database_default NULL
        )