【问题标题】:SQL Server : Update query not working in ASP.NetSQL Server:更新查询在 ASP.Net 中不起作用
【发布时间】:2015-08-05 16:31:29
【问题描述】:

我在更新查询时遇到问题。

我无法运行第二种方法。

这行得通:

if (Methods.Update("TABLE1",
    "Name", TextBoxName.Text,
    "Column1", "1"
    ) == 1)

这不起作用:

if (Methods.Update("TABLE1",
    "Name", TextBoxName.Text,
    "Surname", TextBoxSurname.Text,
    "Column1", "2"
    ) == 1)

我收到此错误:

将 nvarchar 值“a4”转换为数据类型 int 时转换失败。

工作方式:

public static int Update(string Table1, string Column1, string Column1Value, string WhereColumn, string WhereValue)
{
    SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString);
    SqlCommand command = new SqlCommand("UPDATE " + Table1 + " SET " + Column1 + "= @Column1Value " + " WHERE " + WhereColumn + "=@WhereValue", connection);
    command.Parameters.AddWithValue("@Column1Value", Column1Value);
    command.Parameters.AddWithValue("@WhereValue", WhereValue);

    try
    {
        if ((connection.State == ConnectionState.Closed) || (connection.State == ConnectionState.Broken))
        {
            connection.Open();
        }

        int i = Convert.ToInt16(command.ExecuteNonQuery());

        return i;
    }
    finally
    {
        connection.Close();
    }
}

不工作方法:

public static int Update(string Table1, string Column1, string Column1Value, string Column2, string Column2Value, string WhereColumn, string WhereValue)
{
    SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString);
    SqlCommand command = new SqlCommand("UPDATE " + Table1 + " SET " + Column1 + "= @Column1Value," + Column2 + " = @Column2Value WHERE " + WhereColumn + "=" + WhereValue, connection);
    command.Parameters.AddWithValue("@Column1Value", Column1Value);
    command.Parameters.AddWithValue("@Column2Value", Column2Value);
    command.Parameters.AddWithValue("@WhereValue", WhereValue);

    try
    {
        if ((connection.State == ConnectionState.Closed) || (connection.State == ConnectionState.Broken))
        {
            connection.Open();
        }

        int i = Convert.ToInt16(command.ExecuteNonQuery());

        return i;
    }
    finally
    {
        connection.Close();
    }
}

我的表格内容:

TABLE1
------------------------
Name   Surname   Column1
Name1  Surname1  NULL
Name2  Surname2  NULL
Name3  Surname3  a4
Name4  Surname4  NULL
Name5  Surname5  1
Name6  Surname6  2
Name7  Surname7  3

我的表结构:

CREATE TABLE [User1].[TABLE1] 
(
    [ID]            INT            IDENTITY (1, 1) NOT NULL,
    [Name]          NVARCHAR (50)  NOT NULL,
    [Surname]       NVARCHAR (50)  NOT NULL,    
    [Column1]       NVARCHAR (50)  NULL,

    PRIMARY KEY CLUSTERED ([ID] ASC)
);

我无法理解原因。

提前致谢。

【问题讨论】:

  • 除了手头的问题,您应该阅读本文并开始定义参数的数据类型。 blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…
  • 如果您不小心,这可能会让您对 SQL 注入敞开大门。这种特定用法并不是因为值是硬编码的,而是实际与数据库交互的方法无法确保使用代码不会滥用它。
  • 不是通用更新方法的忠实拥护者。防止 sql 注入的挑战是一个真正的难题。为什么不为您的表创建 CRUD 过程。最初需要做更多的工作,但也开始了分离数据层和业务层的道路。
  • @David 实际上这个实现很容易受到 sql 注入的攻击。它接收字符串值,将其构建为 sql 命令并执行它。
  • @SeanLange:是​​的,我就是这么说的。实施是脆弱的。实现的这种特定用法并不是因为易受攻击的部分没有暴露给用户输入,而是核心实现是。如果始终小心使用,就不会有网络漏洞。但我强烈向 OP 建议他明确地确保安全性,而不是假设代码将始终被谨慎使用。

标签: sql asp.net sql-server database


【解决方案1】:

非工作方法的问题是你没有参数化WhereValue

WhereColumn + "=" + WhereValue,

代替

WhereColumn + "=@WhereValue"

所以 SQL 将其转换为 INT,然后无法正确地将其与 a4 行进行比较。

虽然更改第二种方法可以解决您的问题,但您的 SQL 中存在一些安全问题。如果有人向您传递了错误的表或列名,则很有可能遭受 SQL 注入的影响。至少,您应该检查以确保传递的值在实际表和列名的列表中 - 因此有人无法将真正不应该更新的表传递给您。想象一下,如果恶意用户将其传递给您的表名参数:"TableName SET Column1 = 1; SELECT * FROM INFORMATION_SCHEMA.TABLES --",会发生什么。

确实,最好有特定的函数来更新特定的表和值,并确保始终对值进行参数化以避免 SQL 注入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多