首页 > 解决方案 > 为什么或如何参数化查询防止 SQL 注入?

问题描述

假设我想在用户提供用户名和密码时从表中读取用户数据。

我的纯文本查询如下所示:

select * from Users where UserName = '{THIS WILL BE PROVIDED BY USER}' and Password = '{THIS WILL BE PROVIDED BY USER}';

现在我使用 SQL 参数来防止上述查询出现 SQL 注入问题:

SqlCommand command = new SqlCommand();
        command.CommandText = $"select * from Users where UserName = @UserName and Password = @Password";
        command.Connection = connection;

        SqlParameter parameter = new SqlParameter("@UserName", SqlDbType.NVarChar);
        parameter.Value = "{THIS WILL BE PROVIDED BY USER}";
        command.Parameters.Add(parameter);

        SqlParameter parameter2 = new SqlParameter("@Password", SqlDbType.NVarChar);
        parameter2.Value = "{THIS WILL BE PROVIDED BY USER}";
        command.Parameters.Add(parameter2);

如果我使用这样的典型值' OR 1=1 --来重现 SQL 注入,则它不适用于参数化查询。

为什么参数化查询能够防止 SQL 注入?

尽管查询是参数化的,但最终必须在执行时将其转换为“常规”查询。当我们为某个参数设置恶意值时,为什么不生效呢?

引擎盖下会发生什么?

标签: .netsecuritysql-injection

解决方案


推荐阅读