【问题标题】:Inserting into DB with parameters safe from SQL injection?使用不受 SQL 注入影响的参数插入数据库?
【发布时间】:2011-07-16 00:22:07
【问题描述】:

我读了一些关于 SQL 注入的文章,我想确保我的代码可以说是“安全的”,我计划使用 RegExp 验证器来检查用户输入,但这里的另一篇文章建议只使用参数化查询,好吧,我正在使用它们,但我想确保我的代码是安全的,是吗?

        using ( SqlConnection dataConnection = new SqlConnection(myConnectionString) )
        {
            using ( SqlCommand dataCommand = dataConnection.CreateCommand() )
            {
                dataCommand.CommandText = "INSERT INTO Lines (Name, CreationTime) " +
                    "VALUES (@LineName, @CurrentDateTime)";

                dataCommand.Parameters.AddWithValue("@LineName", TextBox2.Text);
                dataCommand.Parameters.AddWithValue("@CurrentDateTime", DateTime.Now.ToString());
                dataConnection.Open();
                //do other DB stuff

我剪掉最后一部分以使帖子更短,其余部分只是尝试捕获异常并关闭数据库连接以及向用户提供插入成功的反馈。

【问题讨论】:

  • 如果CreationTime 列的类型为DateTime,则不需要.ToString() 强制转换。

标签: c# .net asp.net sql sql-injection


【解决方案1】:

是的,这是相当安全的。只要您以后不使用准备好的语句中的“清理”变量来生成动态 sql,通常就可以了。您使用准备好的语句这一事实将负责处理转义字符和其他简单的注入方法。

我不会放弃任何其他验证...

【讨论】:

  • 像什么?除了检查空字段,我还应该检查其他内容吗?
  • 您希望收到什么样的输入?检查任何没有意义的东西。我是客户端和服务器端验证的忠实粉丝,然后使用参数化/准备好的语句。如果没有别的我想看看人们何时试图给我垃圾,即使他们不太可能成功。
【解决方案2】:

您的代码很好,它可以防止注入,因为这些值是作为参数而不是字符串文字传递的。但是,如果您自己编写这种类型的数据访问,您是否考虑过创建SqlParameter 对象并显式设置类型、大小等,并将参数添加到命令中? AddWithValue 可以正常工作,但 SQL Server 必须确定类型,这是一点点但不必要的开销。

【讨论】:

  • 我有,但我不知道如果我这样做会在性能部分好一点,我想我现在会这样做。你认为仍然需要使用 RegExp 验证器吗?
  • 将作为参数传递的用户输入的正则表达式验证器?
【解决方案3】:

好吧,您总是可以尝试在文本框中注入一条 SQL 语句,这可能会给您一个更快、更明确的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多