SQL代码注入是否安全? (以及为什么)

时间:2011-07-23 13:17:31

标签: c# tsql sql-injection

此代码是否可以免于SQL注入?为什么?

public void AddPlayer(string username)
    {
        var query = "INSERT INTO dbo.Player(Username, RegisterDate) VALUES(@Username, @RegisterDate)";
        using (var connection = new SqlConnection(connectionString))
        using (var command = new SqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@Username", username);
            command.Parameters.AddWithValue("@RegisterDate", DateTime.Now);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }

    public DateTime GetRegisterDate(string username)
    {
        var query = "SELECT RegisterDate FROM dbo.Player WHERE Username = @Username";
        using (var connection = new SqlConnection(connectionString))
        using (var command = new SqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@Username", username);
            command.Connection.Open();
            return (DateTime)command.ExecuteScalar();
        }
    }

编辑:可以使用存储过程编写注入安全的等效代码吗?如果是这样,存储过程会是什么样的?

3 个答案:

答案 0 :(得分:9)

是的,它看起来很安全。

因为它使用参数。

创建类似
的查询时,存在SQL注入的风险  baseQueryText + " WHERE Username =" + TextBox.Text;

使用编辑:当您使用存储过程时,您始终使用参数,因此它们也是安全的。无需特殊工作,但您仍然可以/应该过滤传入的数据。

答案 1 :(得分:6)

是。您正在使用参数化查询,这些查询通常被认为是安全的SQL注入。

您仍可能需要考虑过滤输入。

答案 2 :(得分:4)

是的,所有非静态数据都是通过绑定参数输入的。