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);