在更新之前保护数据

时间:2014-01-03 22:42:00

标签: asp.net database c#-4.0 ms-access

我的页面上有几个文本框可以将数据添加到我的数据库中。我正在寻找的是如何让它更安全。空文本框的基本错误检查我知道如何检查。我正在寻找的是保存的错误数据或“'”或“ - ”等特殊字符。它只是我自己的一个简单的应用程序,也许其他两个人会使用它,但仍然希望确保正确学习和编码。有什么建议。这是我的保存按钮。

这是我的代码:

 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";
            }

1 个答案:

答案 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。