如何传递单引号(')从用户输入到存储过程,避免SQL注入

本文关键字:存储过程 输入 避免 注入 SQL 用户 单引号 何传递 | 更新日期: 2023-09-27 18:14:45

我们的应用程序从前端获取用户名作为输入,有时该名称有一个单引号。那么,如果名称包含一个单引号('),如何将输入的名称传递给存储过程呢?

不能将单引号(')直接传递给存储过程输入,因为它可能导致SQL注入。

使用的数据库:SQL Server 2008
应用程序:ASP。. NET c# 4.0

如何传递单引号(')从用户输入到存储过程,避免SQL注入

使用参数化查询。例如,

var command = new SqlCommand("select * from person where firstname = @firstname");
SqlParameter parameter  = new SqlParameter();
parameter.ParameterName = "@firstname";
parameter.Value= "D'Jork";
command.Parameters.Add(parameter);

可以使用参数化查询。单引号由它们处理。

你可以在:Link

深入阅读

您可以使用SqlCommandBuilder.QuoteIdentifier(/* params */):

var sqlCommandBuilder = new SqlCommandBuilder();
var sqlCommand = string.Format("EXEC dbo.SomeProcedure '{0}'",
                         sqlCommandBuilder.QuoteIdentifier("Jack's name"));
// futher sql command process

更多关于msdn。

你需要把它翻倍:

INSERT INTO myTable(text) VALUES ('I don''t like this!')

但正如之前的海报所说…使用参数更好,因为它更安全。

虽然在调用存储过程之前将单引号替换为双引号也应该可以工作,但类似这样的操作也可以工作:

@ phase = '测试"一个"B"C"——测试"可能会'C

但是如果你不想这样做,你也可以尝试使用

Use SET QUOTED_IDENTIFIER OFF

在点击查询之前也可以工作,但请记住,在许多情况下我们需要打开QUOTED_IDENTIFIER