Coding Platform: ASP.NET 2.0 WebForms with C# with MySQL as backend
Background
I am currently working on a bug fixing a website.
One of the table "registrations" have 80 columns.
The Insert/ Update is done through simple sql statements without any parameterized queries.
Problem
At registration, the user can vary many parameters resulting in atleast 15 kinds of INSERT query. My problem is how to ensure all fields are inserted with their correct value.
So, I created a
Dictionary<string, string> fields = new Dictionary<string, string>();
fields.Add("LoginEmail", MySQL.SingleQuoteSQL(txtLoginEmail.Text));
fields.Add("Password", MySQL.SingleQuoteSQL(txtLoginPassword.Text));
fields.Add("ContactName", MySQL.SingleQuoteSQL(txtContactName.Text));
fields.Add("City", MySQL.SingleQuoteSQL(txtCity.Text));
My idea was to make a simple insert query like this
INSERT INTO registrations("all keys as comma separated string") VALUES ("all keys as comma separated string")
My questions are
And also, what are the other better approaches?
P.S: I am maintaining the code and Making an Entity Class mapping the columns to properties and storing the values is not an option in this.
string list<T>(IEnumerable<T> enumerable)
{
List<T> list = new List<T>(enumerable);
return string.Join(",", list.ToArray());
}
//...
string sql= String.Format("INSERT INTO registrations({0}) VALUES({1})",
list(fields.Keys),
list(fields.Values));
I think the dictionary structure is ok in this case but
building and executing the string as is allows for SQL Injection atacks
xkcd.com/327/ Exploits Of A Mom
I am using .NET 3.5 but the idea can be applied to .NET 2.0 also
If MySQL.SingleQuoteSQL does more than it's name suggest then please let me know
Otherwise add the values as parameters to prevent this
var values = new Dictionary<string, string>() {
{"LoginEmail", "LoginEmail"},
{"Password", "Password"},
{"ContactName", "ContactName"},
{"City", "City"}
};
System.Func<string, string> key = p => String.Concat("?", p);
var statement = string.Format("INSERT INTO registrations ({0}) VALUES ({1})",
string.Join(",", values.Values.ToArray()),
string.Join(",", values.Keys.Select(key).ToArray())
);
//"INSERT INTO registrations (LoginEmail,Password,ContactName,City) VALUES (?LoginEmail,?Password,?ContactName,?City)"
foreach(var p in values) {
command.Parameters.Add(key(p.Key), p.Value, SqlDbType.Text);
}
command.Prepare();
command.ExecuteNonQuery();
They may be other better classes for .NET mysql, apologies if so - I haven't used mysql in .NET
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With