.net - 为什么或如何参数化查询防止 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 注入?
尽管查询是参数化的,但最终必须在执行时将其转换为“常规”查询。当我们为某个参数设置恶意值时,为什么不生效呢?
引擎盖下会发生什么?
解决方案
推荐阅读
- python - 打开相机需要永远加载
- javascript - 内联javascript中的锚标记
- bash - Bash 将文件名从月份名称更改为月份编号
- javascript - 无法在“AudioBufferSourceNode”上设置“buffer”属性:无法将值转换为“AudioBuffer”
- python - discord.py“命令已经存在别名”错误,但它不是
- javascript - 如何在百里香th:onclick中获取复选框的当前状态?
- java - 为什么数组没有被修改
- javascript - 我的由对象组成的数组不接受 map 方法(使用 React 函数)
- windows - ZwQueryDirectoryFile 缓冲区溢出
- git - 管理同一台机器上的多个项目存储库使用的大子模块