【发布时间】:2014-06-18 02:56:01
【问题描述】:
我是 SQL Server 新手,我正在尝试使用如下所示的存储过程将记录插入表中。
我想要一个使用以下存储过程的建议。另外:
- 我可以防止 SQL 注入吗?
- 这是正确的方法吗?
如果我在以下导致 SQL 注入的过程中遗漏了任何内容,请纠正我。
Create PROCEDURE [dbo].[spInsertParamTable]
@CmpyCode nvarchar(50),
@Code nvarchar(50),
@DisplayCode nvarchar(50),
@TotalDigit int,
@Nos bigint,
@IdentitY int OUTPUT
AS
BEGIN
INSERT tblParamTable (CmpyCode, Code, DisplayCode, TotalDigit, Nos)
VALUES (@CmpyCode, @Code, @DisplayCode, @TotalDigit, @Nos)
END
SELECT @Identity = SCOPE_IDENTITY();
RETURN @Identity
【问题讨论】:
-
据我所知,SQL 注入攻击发生在 UI(网页)。为了防止 sql 注入攻击,您需要对放置在网页中的输入字段进行验证。
-
@MSRS 不幸的是错误的数据 e.i. SQL 注入可以来自很多地方,包括用户、数据库字段、配置文件。正确的解决方案是使用参数化查询,这样就不会直接执行字符串。
-
只要您不在存储过程中做奇怪的事情,例如构建动态 SQL 并在其上使用
EXECUTE,或者构建包含用户输入的系统命令并使用它运行 xp_cmdshell,您的存储过程应该没问题。但是,正如@rob 所说,您必须使用参数化查询调用存储过程;如果您构建自己的"EXECUTE spInsertParamTable @CmpyCode='"+userInput+...并执行,那么这不会拯救您,因为它将支持 SQLI。请务必使用正确的IDbParameter将参数传递到您的存储过程中。 -
也只授予执行权限,因此您的应用程序级用户只能调用存储过程而不能调用其他任何内容。
标签: c# asp.net sql sql-server-2005