2015-11-18 58 views
0

---这是个人使用,所以不用担心有关SQL注入---在C#中逃脱逗号,冒号和单引号与MySQL

我已经通过几个教程在MySQL转义浏览C#,但找不到一个适用于我(也许我只是使用它不正确)

我试图插入数据到MySQL数据库。

下面的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Diagnostics; 
using System.Net; 
using System.IO; 
using System.Security.Cryptography; 
using MySql.Data; 
using MySql.Data.MySqlClient; 

namespace HASHSITE 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool success; 
      int done = 0; 

      string path = @"C:\Users\somePC\Documents\someFolder\somefile.txt"; 

      string server = "someIP"; 
      string database = "some_db"; 
      string uid = "some_dbu"; 
      string password = "pass"; 
      string connectionstring = "SERVER=" + server + ";DATABASE=" + database + ";UID=" + uid + ";PASSWORD=" + password + ";"; 

      using (var connection = new MySqlConnection(connectionstring)) 
      { 
       connection.Open(); 
       using (var cmd = new MySqlCommand("INSERT INTO databases(data) VALUES(@name)", connection)) 
       { 
        var parameter = cmd.Parameters.Add("@name", MySqlDbType.LongText); 
        foreach(string line in File.ReadLines(path)) 
        { 
         success = false; 
         while (!success) 
         { 
          parameter.Value = line; 
          cmd.ExecuteNonQuery(); //ERROR IS HERE 
          success = true; 
         } 
         done += 1; 
         Console.WriteLine("\n" + done); 
        } 
       } 
      } 
     } 
    } 
} 

我需要转义出现在串线逗号是

name,[email protected]

错误:

Additional information: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'databases(data) VALUES

+0

编写代码像这是第一步** SQL注入**。使用参数绑定。 – lad2025

+0

嘿@ lad2025我个人使用它来上传一些数据。它不会被分发,所以SQL注入现在不是问题 –

+0

由于串联字符串而造成问题。只需绑定参数,你不需要转义它。 – lad2025

回答

0

不要去逃避什么 - 只使用参数化的SQL。您现在可能不在意SQL注入攻击,但您将在的某处点...并通过使用参数化的SQL为您的值,您将删除转义的注入攻击问题。哦,你会减少类型转换的顾虑。并使您的SQL更具可读性。这是一个全面的胜利。

请注意,DATABASES是一个reserved word,所以你确实需要引用 - 或者改变你的表的名字,这将不会是尴尬的。

// TODO: Specify the column name as well, for clarity if nothing else 
cmd.CommandText = "INSERT INTO 'databases' VALUES(@name)"; 
// Adjust for your actual type 
cmd.Parameters.Add("@name", MySqlDbType.LongText).Value = line; 
... 

请注意,您只需要调用虽然cmd.Parameters.Add一次,所以你的情况有一个环,你很可能要调用(并设置命令文本)外循环,然后只需设置Value循环内的属性。

如果有疑问,请养成早期做正确的事情的习惯,而不是假设你会找到时间来解决你以后的坏习惯。

当你在这,现在是开始使用using语句的好时机......你可以重复使用几乎一切,只是在每次迭代改变参数值:

using (var connection = new MySqlConnection(...)) 
{ 
    connection.Open(); 
    using (var command = new MySqlCommand("INSERT INTO 'databases' VALUES(@name)", connection) 
    { 
     var parameter = command.Parameters.Add("@name", MySqlDbType.LongText); 
     foreach (...) 
     { 
      parameter.Value = line; 
      command.ExecuteNonQuery(); 
     } 
    } 
} 
+0

我还会添加一个指定列名称作为良好实践的一部分,显式指定INSERT INTO databases(column_name)VALUES ...。 – lad2025

+1

谢谢你的建议。 我被困在同一个错误: MySql.Data中发生未处理的类型'MySql.Data.MySqlClient.MySqlException'异常。dll 其他信息:您的SQL语法有错误;请检查与您的MariaDB服务器版本对应的手册,以找到正确的语法,以便在第1行的数据库VALUES('TheUnexpected,danepullen @ yahoo.com,Graffiti')'处使用' 发生在:cmd.ExecuteNonQuery(); –

+0

乔恩,是不是'命令=“奇怪的错误消息INSERT INTO数据库VALUES(”+ line +“)”'线?我的意思是,它是_just_字符串连接。如果sql查询需要转义,错误消息不会在'ExecuteNonQuery'行而是? –