C#sqlite注入

如果我改变我的选择

String insSQL2 = "select * from Produtos where nome = '" + txtBuscaNome.Text + "'" 

 String insSQL2 = "select * from Produtos where nome = ''" + txtBuscaNome.Text + "''" 

它会阻止sql注入吗?

没有。

SQL注入不是创造性地使用引号字符。 它是将输入视为数据而不是代码 。 看一下经典的SQL注入漏洞:

 "SELECT * FROM Users WHERE Id = " + someValue; 

它可能直观地看起来像是使用someValue作为数据值,但实际上您将它用作实际的SQL代码 。 SQL引擎不会将此视为值参数,它将其视为正在执行的命令的一部分。 该代码应该只是一个值,但它可以是任何东西。 而且你将执行所提供的任何代码。

以这种方式思考它,很明显你永远不应该在你的应用程序中执行用户提供的代码

另一种方法是将用户输入视为预定义代码中的值。 这样您就可以控制代码的完整范围,而用户只提供值。 哪个看起来更像是这样的:

 "SELECT * FROM Users WHERE Id = @id"; 

现在,SQL引擎会看到该参数( @id ),并希望您为该参数提供一个 。 在ADO.NET中,它可能看起来像:

 someCommand.Parameters.AddWithValue("@id", someValue); 

现在SQL引擎知道这是一个数据值而不是代码,因此它将其视为数据而不是执行它。

不,它不会阻止sql注入。

使用参数化的sql:

 var insSQL2 = "select * from Produtos where nome = @nome"; var connection = new SqlConnection(/* connection info */); var command = new SqlCommand(insSQL2, connection); command.Parameters.AddWithValue("@nome", txtBuscaNome.Text);