gpt4 book ai didi

C#/.NET(核心): Is the type system safe enough to prevent SQL injections?

转载 作者:行者123 更新时间:2023-11-30 19:08:37 26 4
gpt4 key购买 nike

我正在开发一个使用 EF Core 的项目;在一种特定情况下,我必须使用原始 SQLite 命令更新实体的身份。

构建 SqlCommand 并执行由于某种原因不起作用,以及直接将参数传递给 ExecuteSqlCommand() ,它总是抛出异常(我猜这是当前 Sqlite 驱动程序中的错误)。

但是,理论上,下面的代码不应该

string commandText = $"UPDATE {table} SET Id={idPair.Value} WHERE Id={idPair.Key};";

已经防止了SQL注入(inject),因为这里

  • table是我直接从 DbContext 的模型中得到的表名
  • idPair保证是 KeyValuePair<int, int>

?

我问的主要是因为我不知道我是否应该抑制这个特定的警告,或者尝试以另一种方式来做(打开 EntityFrameworkCore.Sqlite 上的错误报告无论如何在待办事项列表中)。

最佳答案

不太可能引起问题,但在某些情况下,它也可能不完全安全。它正在使用当前的文化,这可能提供一些令人讨厌的冲击。这是一个例子:

using System;
using System.Collections.Generic;
using System.Globalization;

class Test
{
static void Main()
{
// Imagine this somewhere entirely different
var badCulture = (CultureInfo) CultureInfo.CurrentCulture.Clone();
badCulture.NumberFormat.NegativeSign = "0 OR 1=1 OR Id=";
CultureInfo.CurrentCulture = badCulture;

// Here's the code that looks innocent
var idPair = new KeyValuePair<int, int>(-5, 10);
string table = "Foo";
string commandText = $"UPDATE {table} SET Id={idPair.Value} WHERE Id={idPair.Key};";

Console.WriteLine(commandText);
}
}

输出:

UPDATE Foo SET Id=10 WHERE Id=0 OR 1=1 OR Id=5;

现在,Foo 中的所有行的 Id 都设置为 10...

可以强制使用不变区域性...但老实说,我不确定这样做是否值得。

我强烈建议对所有 值使用参数。我知道您不能对表名这样做,而且没有好的解决方法,但是对于值您可以并且 IMO 应该使用参数。

撇开其他不谈,如果您尝试对所有您知道它是安全的地方小心地执行此操作,这会给人一种印象,即它始终是安全的,因此粗心的开发人员可能会遵循相同的做法模式并将其与安全的字符串值一起使用。

有一些方法可以通过 FormattableString 使用内插字符串文字来创建安全的参数化 SQL,但是我见过的大多数代码都需要额外调整才能让您 使用它作为表名。

关于C#/.NET(核心): Is the type system safe enough to prevent SQL injections?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52308249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com