【问题标题】:What is the safest way to make SQL queries in c#? [duplicate]在 C# 中进行 SQL 查询最安全的方法是什么? [复制]
【发布时间】:2018-09-12 15:39:38
【问题描述】:

我正在编写一个简单的脚本来根据用户输入查询数据库,我想知道是否有可能注入类似 .net 的参数化查询的东西?

【问题讨论】:

  • 假设没有插入纯字符串并且只触发带有参数名称的常量,则没有注入的机会。这或多或少是为什么如此强烈地鼓励使用参数的原因。 (嗯,它们还有其他好处,例如计划重用,但这是另一回事。)
  • 我明白了。谢谢!
  • 你也可以使用像 EF 这样的 ORM。或者至少我建议使用 Dapper 来避免大量 ADO.Net 样板代码。
  • 完全参数化的 SQL 查询不可能进行 SQL 注入。 .NET 库以防止将参数值重新解释为 SQL cmets 或关键字的方式将参数值传输到 SQL Server。不幸的是,它不会让你 100% 安全。您需要避免某些使系统容易受到注入攻击的构造 - 具体而言,您需要避免直接调用 EXEC

标签: c# sql .net


【解决方案1】:

通过使用 SqlCommand 及其子参数集合,所有检查 sql 注入的痛苦都被消除了,将由这些类处理。

这是一个例子,取自Here

 private static void UpdateDemographics(Int32 customerID,
    string demoXml, string connectionString)
{
    // Update the demographics for a store, which is stored  
    // in an xml column.  
    string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
        + "WHERE CustomerID = @ID;";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(commandText, connection);
        command.Parameters.Add("@ID", SqlDbType.Int);
        command.Parameters["@ID"].Value = customerID;

        // Use AddWithValue to assign Demographics. 
        // SQL Server will implicitly convert strings into XML.
        command.Parameters.AddWithValue("@demographics", demoXml);

        try
        {
            connection.Open();
            Int32 rowsAffected = command.ExecuteNonQuery();
            Console.WriteLine("RowsAffected: {0}", rowsAffected);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多