2009-09-08 15 views

Répondre

4

Étape 1: Ne pas le faire Utiliser un parameterized query à la place.

Les requêtes paramétrées éliminent la plupart des risques associés aux attaques par injection SQL.

À partir du lien:

private void CallPreparedCmd() { 
    string sConnString = 
     "Server=(local);Database=Northwind;Integrated Security=True;"; 
    string sSQL = 
     "UPDATE Customers SET [email protected] WHERE [email protected]"; 
    using (SqlConnection oCn = new SqlConnection(sConnString)) { 
     using (SqlCommand oCmd = new SqlCommand(sSQL, oCn)) { 
      oCmd.CommandType = CommandType.Text; 

      oCmd.Parameters.Add("@sCustomerID", SqlDbType.NChar, 5); 
      oCmd.Parameters.Add("@sCity", SqlDbType.NVarChar, 15); 

      oCn.Open(); 
      oCmd.Prepare(); 

      oCmd.Parameters["@sCustomerID"].Value = "ALFKI"; 
      oCmd.Parameters["@sCity"].Value = "Berlin2"; 
      oCmd.ExecuteNonQuery(); 

      oCmd.Parameters["@sCustomerID"].Value = "CHOPS"; 
      oCmd.Parameters["@sCity"].Value = "Bern2"; 
      oCmd.ExecuteNonQuery(); 

      oCn.Close(); 
     } 
    } 
} 

Cela étant dit, vous pouvez insérer des citations dans une chaîne en échappant les guillemets doubles comme ceci:

string newstring = " \"I'm Quoted\" "; 
+0

Les paramètres peuvent empêcher quelque chose comme cela ajouté à la fin de la requête; drop article de la table – user161433

+2

Oui, car les paramètres ne sont pas exécutés en tant que sql littéral et sont vérifiés par type.Voir http://www.mikesdotnetting.com/Article/113/Preventing-S QL-Injection-in-ASP.NET. –

-1

Je ne sais pas si des guillemets doubles vous aider (que vous pouvez ajouter si vous le souhaitez en échapper à la citation, comme dans \ "). Ce que je l'ai fait dans le passé est de garder à l'esprit des guillemets simples, donc je fis un remplacement sur le contenu de @val avant de l'inclure dans la requête, comme dans val.Replace("'", "''").

+1

Désolé, downvoting parce que ce n'est pas la façon de le faire dans .NET; ce n'est pas suffisant (c'est-à-dire que le paramètre ne contient pas de guillemets car il est normalement numérique –

+0

Je ne sais pas trop d'où vient le vote négatif –

+0

Assez juste, mais le post original de l'OP présume que @val est textuel –

2

pour éviter l'injection SQL vous ne devez utiliser SqlParameter objets pour toutes vos requêtes, comme ceci:

SqlCommand command = new SqlCommand("update tblFoo set x = @x"); 
SqlParamter param = new SqlParameter("@x", SqlDbType.NVarChar); 

param.Value = "hello\""; 

command.Parameters.Add(param);