C# 在C中使用mySQL转义逗号、冒号和单引号#
---这是供个人使用的,所以不要担心SQL注入--- 我一直在浏览几个关于mySQL转义C的教程,但找不到一个适合我的(可能我只是用错了) 我正在尝试将数据插入mySQL数据库 代码如下:C# 在C中使用mySQL转义逗号、冒号和单引号#,c#,mysql,C#,Mysql,---这是供个人使用的,所以不要担心SQL注入--- 我一直在浏览几个关于mySQL转义C的教程,但找不到一个适合我的(可能我只是用错了) 我正在尝试将数据插入mySQL数据库 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System
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@name.com
错误:
附加信息:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,了解使用near数据库(数据)值的正确语法
不要试图逃避任何事情,只要使用参数化SQL即可。您现在可能不关心SQL注入攻击,但在某个时候您会。。。通过对值使用参数化SQL,可以消除转义和注入攻击问题。哦,这样可以减少对类型转换的担忧。并使您的SQL更具可读性。这是一场全面的胜利 请注意,
DATABASES
是一个,因此您确实需要引用它,或者将表的名称更改为不那么麻烦的名称
// 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
一次,因此对于循环,您可能希望在循环外部调用它(并设置命令文本),然后只需在循环内部设置值
属性
当你有疑问时,尽早养成做正确事情的习惯,而不是假设你以后会有时间改掉你的坏习惯
当您正在使用时,现在正是开始使用语句的好时机。。。您可以重用几乎所有东西,只需在每次迭代中更改参数值:
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();
}
}
}
编写这样的代码是SQL注入的第一步。使用参数绑定。嘿@lad2025我个人用它上传一些数据。它不会被分发,所以SQL注入现在不是问题,因为您连接了字符串,所以您创建了问题。只需绑定参数,您不需要转义它。您能给我该参数的代码吗?只需搜索string.Format
我还将添加以明确指定列名插入数据库(列名)值…
作为良好实践的一部分。谢谢您的建议。我遇到了相同的错误:MySql.Data.MySqlClient.MySqlException类型的未处理异常发生在MySql.Data.dll中。其他信息:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,了解使用“数据库值”附近的正确语法(“意外,danepullen@yahoo.com,Graffiti'),位于第1行,位于cmd.ExecuteNonQuery()处;Jon,在command=“INSERT INTO databases VALUES(“+line+”)”
line上出现了奇怪的错误消息,不是吗?我的意思是,它只是一个字符串连接。如果需要转义sql查询,则错误消息不会出现在ExecuteNonQuery
行上?@SonerGönül:我个人怀疑这是一个诊断错误。我的错误是,错误消息出现在ExecuteNonQuery上,但这是因为我的声明不正确。我道歉。