C# 使用SQL注入安全的参数插入数据库?

C# 使用SQL注入安全的参数插入数据库?,c#,.net,asp.net,sql,sql-injection,C#,.net,Asp.net,Sql,Sql Injection,我一直在读一些关于SQL注入的文章,我想确保我的代码是安全的,比如说“安全的”,我计划使用RegExp验证器来检查用户输入,但这里的另一篇文章建议只使用参数化查询,我正在使用它们,但我想确保我的代码是安全的,是吗 using ( SqlConnection dataConnection = new SqlConnection(myConnectionString) ) { using ( SqlCommand dataCommand = d

我一直在读一些关于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

我删去最后一部分以缩短文章的篇幅,其余部分只是尝试捕捉异常,关闭数据库连接,以及提供用户对插入成功的反馈。

好吧,您可以尝试向文本框中插入SQL语句,这可能会给您一个更快、明确的答案

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

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


不过,我不会放弃任何其他验证…

如果
CreationTime
列的类型为
DateTime
,则您不需要
.ToString()
强制转换。我曾经这样做过,但我不知道如果我这样做会在性能方面有所改善,我想我现在会这样做。你认为仍然有必要使用RegExp验证器吗?用户输入的Regex验证器将作为参数传递?比如什么?除了检查空字段外,我还应该检查其他内容吗?您希望接收什么类型的输入?检查任何不合理的地方。我非常喜欢客户端和服务器端验证,然后使用参数化/准备好的语句。如果我不想看到别人给我垃圾,即使他们不太可能成功。