gpt4 book ai didi

.net - 在 .NET 的动态 SQL 中清理表/列名? (防止SQL注入(inject)攻击)

转载 作者:行者123 更新时间:2023-12-04 01:30:46 26 4
gpt4 key购买 nike

我正在生成一些动态 SQL,并希望确保我的代码不受 SQL injection 的影响.

为了论证起见,这里是一个如何生成它的最小示例:

var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);

在上面, tableName , columnName , 以及绑定(bind)到 @value 的任何内容来自不受信任的来源。由于使用了占位符 @value不受 SQL 注入(inject)攻击,可以忽略。 (该命令通过 SqlCommand 执行。)

但是, tableNamecolumnName不能被绑定(bind)为占位符,因此容易受到注入(inject)攻击。由于这是一个“真正动态”的场景,因此没有 tableName 的白名单。或 columnName可用的。

因此问题是:

是否有标准的内置方法来检查和/或 sanitizer tableNamecolumnName ? (SqlConnection 或辅助类等)如果不是,那么在不使用 3rd 方库的情况下执行此任务的好方法是什么?

笔记:
  • 所有 SQL 标识符,包括模式,都应该被接受:例如[schema].[My Table].columntable1 一样“安全” .
  • 可以清理标识符或检测无效标识符。 (不需要确保表/列在上下文中实际有效;生成的 SQL 可以是无效的,但必须是“安全的”。)


  • 更新:

    刚发现这个,觉得有点意思:有一个 SqlFunctions.QuoteName .NET4 (EF4?) 中的函数。好吧,这对我没有帮助......

    最佳答案

    我不确定你是否还在调查这个,但是 DbCommandBuilder类提供了一个方法QuoteIdentifier以此目的。这样做的主要好处是它独立于数据库并且不涉及任何 RegEx 困惑。

    从 .NET 4.5 开始,您只需使用 DbConnection 对象就拥有清理表名和列名所需的一切:

    DbConnection connection = GetMyConnection(); // Could be SqlConnection
    DbProviderFactory factory = DbProviderFactories.GetFactory(connection);

    // Sanitize the table name
    DbCommandBuilder commandBuilder = factory.CreateCommandBuilder();

    string tableName = "This Table Name Is Long And Bad";
    string sanitizedTableName = commandBuilder.QuoteIdentifier(tableName);

    IDbCommand command = connection.CreateCommand();
    command.CommandText = "SELECT * FROM " + sanitizedTableName;

    // Becomes 'SELECT * FROM [This Table Name Is Long And Bad]' in MS-SQL,
    // 'SELECT * FROM "This Table Name Is Long And Bad"' in Oracle, etc.

    (在 4.5 之前,您需要一些其他方式来获取您的 DbProviderFactory ——可能来自应用程序配置中的数据提供者名称,或者在某处硬编码。)

    关于.net - 在 .NET 的动态 SQL 中清理表/列名? (防止SQL注入(inject)攻击),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651582/

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