首页 > 解决方案 > 防止 SQL 注入 - CREATE 序列命令

问题描述

我有一个非常简单的存储过程,它生成下一个序列作为简单自动编号解决方案的一部分。

SQL 存储过程是

CREATE PROCEDURE [dbo].[NextAutoNumber]

@Key varchar(100),
@UserId varchar(50),
@Return bigint output

AS

BEGIN

SET NOCOUNT ON;

DECLARE @cmd NVARCHAR(1000)

IF (NOT EXISTS (SELECT * FROM sys.sequences WHERE name = @Key))
BEGIN
--CREATE SEQUENCE FOR NEW ENTITY
EXEC('CREATE SEQUENCE [dbo].' + @Key + ' AS BIGINT START WITH 1 INCREMENT BY 1 NO CYCLE')
END

SET @cmd = 'SET @Return = (NEXT VALUE FOR ' + @Key + ')'

EXEC sp_executesql @cmd, N'@Return int output', @Return output;

END

GO

我正在从 Web 服务调用此存储过程,如下所示。

        using (var conn = new SqlConnection(_connectionString))
        using (var cmd = new SqlCommand("NextAutoNumber", conn))
        {

            cmd.CommandType = CommandType.StoredProcedure;
            if (conn.State == System.Data.ConnectionState.Closed)
                conn.Open();

            cmd.Parameters.Add(new SqlParameter("@Key", SqlDbType.Text)
            {
                Value = key,
                Direction = ParameterDirection.Input
            });

            cmd.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Text)
            {
                Value = userId,
                Direction = ParameterDirection.Input
            });

            cmd.Parameters.Add(new SqlParameter("@Return", SqlDbType.BigInt) { Direction = ParameterDirection.Output });

            cmd.ExecuteNonQuery();
            return (long)cmd.Parameters["@Return"].Value;
        }

现在,他们报告说这很容易受到 SQL 注入攻击。关于如何修改它以防止 SQL 注入的任何想法?

我查看了以下选项 - 例如使用参数化查询,但我的 SQL 技能非常基础!

标签: c#sql-serversql-server-2012sql-injection

解决方案


推荐阅读