我的页面上有几个文本框可以将数据添加到我的数据库中。我正在寻找的是如何让它更安全。空文本框的基本错误检查我知道如何检查。我正在寻找的是保存的错误数据或“'”或“ - ”等特殊字符。它只是我自己的一个简单的应用程序,也许其他两个人会使用它,但仍然希望确保正确学习和编码。有什么建议。这是我的保存按钮。
这是我的代码:
try
{
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=H:\Databases\AddressBook.mdb");
conn.Open();
DataSet ds = new DataSet();
string cmd = "SELECT * FROM tblAddressBook";
OleDbDataAdapter da = new OleDbDataAdapter(cmd, conn);
da.Fill(ds, "Display");
DataRow newRow = ds.Tables["Display"].NewRow();
newRow[1] = txtFirstName.Text;
newRow[2] = txtLastName.Text;
newRow[3] = txtEmail.Text;
newRow[4] = txtPhone.Text;
ds.Tables["Display"].Rows.Add(newRow);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
cb.DataAdapter.Update(ds.Tables["Display"]);
conn.Close();
GridView1.DataBind();
}
catch (Exception)
{
lblErrorSave.Text = "Your information did not save clear form and try again";
}
答案 0 :(得分:1)
您显示的代码是安全的,但确实存在问题。
你的问题是SQL注入。这就出现在使用动态SQL的地方,如此(航空代码):
string sql = "insert into tableA (cola, colb) values ("
+ "'" + txtBox1.Text + "',"
+ "'" + txtBox2.Text + "')";
...然后去执行它。根据文本框的内容,您可能会发生各种各样的事情。像“'); drop table tableA; - ” 当您使用上面的DataSet时,这不会发生,所以没关系
Hoewever,你的代码非常低效。你要做的第一件事是下拉整个地址表。如果这是任何大小,它将会很慢,并为该过程添加了大量的IO,内存和计算。
您也没有检查要输入的行实际上是新行,而不是修改旧行或重复行。这可能对您的应用程序很重要,也可能不重要,但通常很重要(重复数据可能是一个真正的痛苦)。您可以修改您对地址表的读取,例如一行具有相同的电子邮件地址(或任何唯一的),如果它得到它,然后像上面那样使用新数据进行修改。
但是如果要添加数据,则需要使用参数;航空代码:
string sql = "insert into table (colA, colB) values (@colA, @colB)";
using (OleDbCommand com = new OleDbCommand(sql, conn))
{
com.Parameters.Add("@colA", txtBox1.Text);
com.Parameters.Add("@colB", txtBox2.Text);
com.ExecuteNonQuery();
}
(请注意,不同的驱动程序在添加参数时的语法略有不同,我不确定OleDb命令是否支持这种语法,但会有一些接近。)
使用参数会阻止SQL注入,因为参数的值不会在SQL字符串中混合传输,因此它们的内容不会影响最终执行的SQL。