如何防止SQL注入转义string

我有一些查询(对acccess数据库)像这样:

string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL='" + user + "' AND PASSWORD_AZIENDA='" + password + "'"; 

我想“逃避”用户和密码,防止注射。

我怎样才能用C#和.NET 3.5做到这一点? 我正在寻找PHP的mysql_escape_string …

你需要使用参数。 好吧,不必但是会更好。

 SqlParameter[] myparm = new SqlParameter[2]; myparm[0] = new SqlParameter("@User",user); myparm[1] = new SqlParameter("@Pass",password); string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@User AND PASSWORD_AZIENDA=@Pass"; 

不要逃避string开始 – 使用参数化的查询。 这超过了逃避的好处:

  • 代码更容易阅读
  • 你不必依靠逃避正确
  • 有可能有性能改进(数据库特定等)
  • 它将“代码”(SQL)从数据中分离出来,这在逻辑上是合理的
  • 这意味着您不必担心数字和date/时间等数据格式。

SqlCommand.Parameters的文档给出了一个很好的完整示例。

您应该使用SQL参数来防止SQL注入代码

 // // The name we are trying to match. // string dogName = "Fido"; // // Use preset string for connection and open it. // string connectionString = ConsoleApplication716.Properties.Settings.Default.ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // // Description of SQL command: // 1. It selects all cells from rows matching the name. // 2. It uses LIKE operator because Name is a Text field. // 3. @Name must be added as a new SqlParameter. // using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection)) { // // Add new SqlParameter to the command. // command.Parameters.Add(new SqlParameter("Name", dogName)); // // Read in the SELECT results. // SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { int weight = reader.GetInt32(0); string name = reader.GetString(1); string breed = reader.GetString(2); Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight, name, breed); } } } 

是的,您可以通过使用Named Parameters来避免注射

使用参数而不是转义string:

 var comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@user AND PASSWORD_AZIENDA=@password"; 

然后在执行SqlCommand之前为这些参数赋值。

您可以检查下面的链接,了解如何防止ASP.Net中的SQL注入。 我宁愿使用

  1. 使用参数化查询或存储过程。
  2. validation特殊字符,如“(非常危险)

http://dotnet.dzone.com/news/aspnet-preventing-sql-injectio

如果你可以将这些转换成命名参数,我想你会得到更好的服务。

@Jethro

你也可以这样写:

 SqlParameter[] sqlParams = new SqlParameter[] { new SqlParameter("@Name", contact.name), new SqlParameter("@Number", contact.number), new SqlParameter("@PhotoPath", contact.photoPath), new SqlParameter("@ID", contact.id) }; 

PT:Siga os passos a seguir e resolva o problema de SQL INJECTION

EN:按照以下步骤解决SQL注入问题:

ES:Siga los siguientes pasos y resolver el problema de lainyecciónde SQL:

 OracleParameter[] tmpParans = new OracleParameter[1]; tmpParans[0] = new Oracle.DataAccess.Client.OracleParameter("@User", txtUser.Text); string tmpQuery = "SELECT COD_USER, PASS FROM TB_USERS WHERE COD_USER = @User"; OracleCommand tmpComand = new OracleCommand(tmpQuery, yourConnection); tmpComand.Parameters.AddRange(tmpParans); OracleDataReader tmpResult = tmpComand.ExecuteReader(CommandBehavior.SingleRow);