C # sqlite injection

Si je change mon choix de

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

À

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

Est-ce que cela empêchera l’injection de SQL

Non.

L’injection SQL ne consiste pas à utiliser de manière créative des caractères de citation. Il s’agit de traiter les entrées comme des données plutôt que comme du code . Jetez un coup d’œil à une vulnérabilité d’injection SQL classique:

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

Vous pouvez penser intuitivement que vous utilisez someValue tant que valeur de données, mais vous l’utilisez en tant que code SQL réel . Le moteur SQL ne voit pas cela comme un paramètre de valeur, il le voit comme faisant partie de la commande en cours d’exécution. Ce code devrait juste être une valeur, mais ça peut être n’importe quoi. Et vous exécuteriez le code fourni.

En le pensant de cette manière, il devient évident que vous ne devez jamais exécuter de code fourni par l’utilisateur dans votre application.

L’alternative consiste à traiter les entrées utilisateur comme des valeurs dans un code prédéfini . De cette façon, vous contrôlez la scope complète du code et les utilisateurs ne fournissent que des valeurs. Ce qui ressemblerait plus à ceci:

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

À présent, le moteur SQL voit ce paramètre ( @id ) et s’attend à ce que vous lui fournissiez une valeur . Dans ADO.NET, cela pourrait ressembler à quelque chose comme:

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

À présent, le moteur SQL sait qu’il s’agit d’une valeur de données et non de code. Il la traite donc comme une donnée au lieu de l’exécuter.

Non, cela n’empêchera pas l’injection SQL.

Utilisez sql paramétré:

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