c# - 这段代码可以避免 SQL 注入(inject)吗? (以及为什么)

标签 c# tsql sql-injection

此代码是否可以免受 SQL 注入(inject)攻击?为什么?

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();
        }
    }

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

最佳答案

是的,看起来很安全。

因为它使用了参数。

当您创建类似
的查询时,您将面临 SQL 注入(inject)的风险 baseQueryText + "WHERE Username ="+ TextBox.Text;

注意编辑:当您使用存储过程时,您总是使用参数,因此它们也是安全的。不需要特别的努力,但您仍然可以/应该过滤传入的数据。

关于c# - 这段代码可以避免 SQL 注入(inject)吗? (以及为什么),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800626/

相关文章:

php - PHP 中的 SQL 注入(inject) MySql

c# - 验证 .NET 时间格式的正则表达式

c# - SqlBulkCopy 和在标识列上具有父/子关系的 DataTables

sql - 选择的 Where 子句 - 非 Ascii 字符?

sql - 我如何说服 'developers' 团队这有多糟糕?

security - 在 Web 开发期间,我将花费多少时间在用户输入验证上?

c# - Lutz Roeder 的 HTML Writer 在 SaveHtml() 方法中只返回 2 个字符

c# - 反序列化类为空 - JSON C#

sql - 通过某种排序从表中删除前 N 行(按 'Column' 排序)

tsql - 遍历表行的最佳方法是什么?