我正在开发Visual Studio中基于表单的Visual C#项目。它将输入转换为C#表单,文本框更新我们的mysql服务器,并且在加载表单时,数据库中的现有值将从DB加载。
我是CSUS的学生,该项目是我对软件工程课程的一部分。我和我的团队已经自学了C#和SQL来完成项目,所以我们所做的每件事都要么不完全正确,要么非常糟糕。我最近发现了SQL注入,并且我正在尝试编写我的应用程序来防范它。我已经读过我需要使用参数化输入,但我正在努力学习语法。我发现的大多数示例似乎都假设我对C#或SQL了解得更多,并且它们显示正确的语法,而没有很多如何将其从错误类型转换的示例。
以下代码是我们在程序中经常使用的查询类型的简化示例。 PDFExporter是我创建的库,它有一个globalvariable类,包含一些字符串常量,其中一个是我们的sql server连接字符串。对我有用的东西是用参数编写的类似SQL查询的一个例子,任何提示或评论都会非常感激。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
//.
//.
//.
string column = "FR18_ClientID, ClientDSMIV, ClientPCounselor, ClientMethPayInt;
string values = "'" + client + "', + '" + DSMIV.Text + "', + '" + PCounselor.Text + "', + '" + PaymentMethod.Text + "'";
string onupdate = "FR18_ClientID = VALUES(FR18_ClientID) , ClientDSMIV = VALUES(ClientDSMIV), ClientPCounselor = VALUES(ClientPCounselor), ClientMethPayInt = VALUES(ClientMethPayInt);
MySqlConnection con = null;
con = new MySqlConnection(PDFExporter.GlobalVar.SERVER);
con.Open();
MySqlCommand command = con.CreateCommand();
command.CommandText = "INSERT INTO FR18_Bookkeeping (" + column + ")" + " VALUES(" + values + ")ON DUPLICATE KEY UPDATE " + onupdate;
command.ExecuteNonQuery();
con.Close();
我们的程序也有很多select语句,但是我们用来查询数据库的值是一个内部值,它不是由用户输入设置或改变的。一个简单的例子可能是
string autofill = " SELECT * FROM FR18_Bookkeeping WHERE FR18_ClientID = " + client;
客户端永远不会被用户设置,而且几乎所有表都是foriegn键。是否有必要对此查询进行参数化?
答案 0 :(得分:4)
参数不是只是关于sql注入,虽然这当然是一个非常重要的用法(坦率地说,我仍然担心sql注入,即使是内部数据),但其他优点参数:
O'Brien
我强烈建议您使用参数。如果你使用像" dapper"这样的工具,这不需要复杂。例如:
int client = ...
var rows = conn.Query<Bookkeeping>(
"SELECT * FROM FR18_Bookkeeping WHERE FR18_ClientID = @client",
new { client }).ToList();
完全参数化,没有任何痛苦。