【问题标题】:What's the benefit of inserting/updating sending parameters?插入/更新发送参数有什么好处?
【发布时间】:2014-02-15 04:13:03
【问题描述】:

我是数据库新手,我正在使用带有 C# 的 Access 2007 数据库进行销售点。我有以下方法:

public static OleDbCommand connect()
{
    try
    {
        string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
        string cadena = @"Provider=Microsoft.ACE.OLEDB.12.0;Data   Source="+path+@"\Documents\VikingPOS.accdb";
        conexion = new OleDbConnection(cadena);
        conexion.Open();
        command = new OleDbCommand();
        command = conexion.CreateCommand();
        return command;

    }
    catch (OleDbException e)
    {
        MessageBox.Show("Error: {0}", e.Errors[0].Message);
        return null;
    }
}

所以我一直以这种方式插入和更新表格的信息:

OleDbCommand link = Conexion.connect();
link.CommandText = "UPDATE ordenes SET subtotal = " + subtotal + ",impuesto = " + impuesto + ",total = " + total + " WHERE id_mesa = " + id_mesa + " AND id_estado = 1";
link.ExecuteNonQuery();

OleDbCommand link = Conexion.connect();
link.CommandText = "INSERT INTO secciones(descripcion,fecha_insert) VALUES ('" + nombre + "',Date())";
link.ExecuteNonQuery();

但我也看到有些人使用以下语法插入和更新:

using (OleDbConnection myCon = new OleDbConnection(connectionString))
{
    try
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "UPDATE ingredientes SET [descripcion]=?,[id_medida]=?,[id_categoria]=?,[costo]=?,[impuesto]=?,[precio_venta]=?,[existencia]=?,[fecha_insert]=? WHERE [id_ingrediente]=?";
        cmd.Parameters.AddWithValue("@descripcion", p.getNombre());
        cmd.Parameters.AddWithValue("@id_medida", p.getId_medida());
        cmd.Parameters.AddWithValue("@id_categoria", p.getId_categoria());
        cmd.Parameters.AddWithValue("@costo", p.getCosto());
        cmd.Parameters.AddWithValue("@impuesto", p.getImpuesto());
        cmd.Parameters.AddWithValue("@precio_venta", p.getPrecio_venta());
        cmd.Parameters.AddWithValue("@existencia", p.getExistencia());
        cmd.Parameters.AddWithValue("@fecha_insert", fechaHoy);
        cmd.Parameters.AddWithValue("@id_ingrediente", p.getId());
        cmd.Connection = myCon;
        myCon.Open();
        int x = cmd.ExecuteNonQuery();
        ...

所以我的问题是,使用“AddWithValue”方法将值作为参数传递有什么好处?我这样做的方式很简单,但到目前为止效果很好,这就是我一直这样做的原因。

【问题讨论】:

    标签: c# ms-access-2007 oledb insert-update oledbcommand


    【解决方案1】:
    String cmd = "UPDATE ingredientes SET [descripcion]=?";
    

    这些被称为参数化 SQL 查询,可以避免 SQL 注入攻击

    当您通过将值直接注入表列来使用 sql 语句时,可能会误用它来访问/修改数据。

    现在举一个使用普通 SQL 查询的例子,看看 SQL 注入攻击是如何发生的

    示例:

    String cmd="UPDATE ingredientes SET [descripcion]='"+TextBox1.Text+"'";
    

    让我们假设如果用户在 TextBox 中输入以下命令

    TextBox value = > "xyz;delete * from Users;"
    

    现在命令看起来像这样

    String cmd="UPDATE ingredientes SET [descripcion]=xyz;delete * from Users;";
    

    上面的命令首先用给定的描述 xyz 更新表,但也从Users表中删除数据

    【讨论】:

    • 谢谢!你的回答很清楚,我没有想到我肯定想避免的那种可能性。
    • @user3312437:不客气,亲爱的:),很高兴能帮到你。
    【解决方案2】:

    1-避免 SQL 注入

    2-代码更干净

    3-代码是可变的

    【讨论】:

      【解决方案3】:

      一个主要的好处是它可以保护您免受 SQL 注入攻击。

      例如,如果我在nombre 字段中输入Bobby'; DROP TABLE secciones;-- 会怎样。如果您没有正确清理输入,您可能会丢失整个表(取决于权限)。

      因此,您不必为每个输入都想出自己的清理程序,如果您只是使用参数化查询,您将得到更好的保护。

      【讨论】:

        【解决方案4】:

        您的问题是为什么要添加参数而不是简单地制作 OLE DB 字符串并形成 SQL 查询。对?

        使用字符串连接生成查询的问题是:SQL注入。如果您正在为多个用户或网页制作代码。然后,您必须使用 Parameters.Addvalue 方法来提高安全性。此外,Parameters.Add 值对程序员来说更直观。但如果它只是一个涉及很少人的小项目,那么它完全可以使用。

        如果我错了请告诉我!

        【讨论】:

        • 是的,你没看错,谢谢你的回答,我想知道我是否应该把我插入和更新信息的方式的改变作为我的主要优先事项,但因为这不是web 项目,不会被很多用户使用(而且用户也没有编程知识)我不认为这将是一个短期问题,所以我暂时保留它我会在未来改进它。再次感谢您。
        猜你喜欢
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 2020-02-28
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        相关资源
        最近更新 更多