我有一个通过插入C#中的值创建的SQL查询。
在C#中:
string command = "INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL)
VALUES (" + model + ", " + batterylife + ", " + price + ", " + antutu + ", " + imgURL + " )";
在解析后的SQL中:
INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL)
VALUES ( Samsung-Galaxy-S10-5G, 0, 0, 0,
cdn2.gsmarena.com/vv/bigpic/samsung-galaxy-s10-5g.jpg )
,并在尝试执行它时,Visual Studio引发以下异常:
System.Data.SqlClient.SqlException
HResult = 0x80131904
Message ='G'附近的语法不正确。
Source = .Net SqlClient数据提供程序
此外,当我用单词替换常规模型名称变量时,Visual Studio会为小g抛出相同的异常,而没有位置帮助来理解。
答案 0 :(得分:0)
正如其他人所指出的,您正在使用字符串串联来构建SQL命令,这将在代码中启用SQL注入。
请改用以下模式,该模式依赖于参数,因此不受此攻击的影响:
using System.Data.SqlClient;
using System.Data;
...
using (var cn = new SqlConnection("YourConnectionString"))
{
cn.Open();
using (var cm = cn.CreateCommand())
{
cm.CommandType = System.Data.CommandType.Text;
cm.CommandText =
"INSERT INTO Phones (devicename, batterylife, price, antutu, ImageURL) " +
"VALUES (@devicename, @batterylife, @price, @antutu, @ImageURL)";
cm.Parameters.Add("@devicename", SqlDbType.VarChar, 50).Value = "Samsung-Galaxy-S10-5G";
cm.Parameters.Add("@batterylife", SqlDbType.Int).Value = 0;
cm.Parameters.Add("@price", SqlDbType.Int).Value = 0;
cm.Parameters.Add("@antutu", SqlDbType.Int).Value = 0;
cm.Parameters.Add("@ImageURL", SqlDbType.VarChar, -1).Value = "cdn2.gsmarena.com/vv/bigpic/samsung-galaxy-s10-5g.jpg";
cm.ExecuteNonQuery();
}
}
您必须根据需要调整每个SqlParameter
的大小/类型。