为SQL生成安全更新语句

本文关键字:安全更新 语句 SQL | 更新日期: 2023-09-27 18:19:18

我可能在这里错过了一些东西,但是我已经搜索了几个小时,我要么没有找到我需要的东西,要么我没有在正确的条件下搜索。尽管如此,这正是我正在努力做的。

我目前正在探索从EF迁移到普通的旧ADO。我很高兴,虽然这样做有一个开发打击,但所有当前的测试点ADO仍然比EF快很多倍(这使得EF建立在ADO上是有意义的)。

让我有点困惑的是,为表行生成一个更新语句,而且是一个高效的更新语句。任何update语句都可能更改1个或10个字段的值,但显然只发布需要更改的数据更有效。

我的问题是,什么是最好的方式来生成更新语句,以保持从SQL注入保护?

例如,一个列值更新将是

update Table1 set Column2 = 'somevalue' WHERE Column1 = @id;

其中两列是

update Table1 set Column2 = 'somevalue', Column 3 = 'some other value' WHERE Column1 = @id;

谁有最好的做法,他们如何处理这个问题?

附加信息:

我的提议被否决了,但老实说,我认为那是因为我还没有说清楚我想要什么。

让我开始确认,我知道我有直接SQL命令的选项(我相当胜任)或将上述命令放在存储过程中,并从ADO调用。我也完全理解在用户输入的SQL语句中使用参数的重要性。

想象下面的表格:

DECLARE @example TABLE
(
Id INT IDENTITY NOT NULL,
Name VARCHAR(50) NOT NULL,
Description VARCHAR(1000) NOT NULL
);
-- Indexes omitted for simplicity

现在假设我有一个API,允许用户更新该表中的一行。用户可以通过传递Id来更新Name、Description或这两个列。该调用与任何"结果集"完全断开连接,因此我必须手动(或通过存储过程)向数据库发出UPDATE命令。

为了将数据传输保持在最低限度(从而有助于最大化性能),我想满足以下场景:

  • 用户更新只是名称

    UPDATE @example SET [Name] = @name WHERE [Id] = @id;
    
  • User updates just Description

    UPDATE @example SET [Description] = @description WHERE [Id] = @id;
    
  • 用户同时更新

    UPDATE @example SET [Name] = @name, [Description] = @description WHERE [Id] = @id;
    

毕竟,对于每个调用,我不知道调用者希望更新什么。

实际上,表可以有很多很多列,为每一个可能的组合创建相关的SQL语句是完全荒谬的,更不用说保持更新所需要的荒谬的努力了。

我正在寻找的(因为我似乎在搜索中缺少)是如何生成一个安全的SQL语句,该语句根据用户提供的内容和使用的参数来满足每个选项,并生成尽可能小的查询-需要,因为如果用户没有传递值,我们就无法更新列值。

我希望这有助于更好地澄清需求

为SQL生成安全更新语句

在所有情况下参数化所有值。这将确保您避免SQL注入攻击。至于跟踪哪些字段发生了变化并因此需要更新的模式,这是一个更大的练习,可以在互联网上找到许多示例,供您阅读。

update Table1
set Column2 = @Column2,
  Column3 = @Column3
where Column1 = @Column1