c# - 防止 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 技能非常基础!
解决方案
推荐阅读
- sql - SQL 查询和表连接
- ios - SwiftUI 切换不改变值
- reactjs - 将图像标签添加到 SVG 反应组件
- android - 按钮单击以更改片段中的视图 - Kotlin
- android - 依赖 com.android.tools.build:gradle:3.6.4 因为没有定义存储库
- python - Python - 分层风险平价 (PyPortfolioOpt) - 滚动窗口
- typescript - 是否可以在没有转译的情况下制作类型安全的 Vue 应用程序?
- java - 尽管 URI 正确,但在 SpringBoot 应用程序中注册过程时收到未找到错误
- java - 不知道为什么在替换 paymentKey 和 Session key 的值后必须说无效的 Json
- python - SQLite3 (python) 查询在一个 SELECT 语句中搜索多个列