c# - 当参数不是字符串时,不参数化 SQL 查询是否安全?

标签 c# sql sql-injection sqlcommand parameterized-query

SQL injection方面, 我完全理解参数化 string 参数的必要性;这是书中最古老的技巧之一。但是什么时候可以参数化SqlCommand?是否有任何数据类型被认为是不参数化的“安全”数据类型?

例如:我不认为自己接近是 SQL 专家,但我想不出任何可能容易受到 SQL 注入(inject)攻击的情况来接受 boolint 并将其直接连接到查询中。

我的假设是否正确,或者这是否可能在我的程序中留下巨大的安全漏洞?

为了澄清,这个问题被标记为 这是一种强类型语言;当我说“参数”时,想想类似 public int Query(int id)

最佳答案

我认为这是安全的...技术上,但养成这种习惯是很糟糕的。您真的要编写这样的查询吗?

var sqlCommand = new SqlCommand("SELECT * FROM People WHERE IsAlive = " + isAlive + 
" AND FirstName = @firstName");

sqlCommand.Parameters.AddWithValue("firstName", "Rob");

在类型从整数变为字符串的情况下,它也会使您容易受到攻击(想想员工编号,尽管它的名字可能包含字母)。

因此,我们将 EmployeeNumber 的类型从 int 更改为 string,但忘记更新我们的 sql 查询。哎呀。

关于c# - 当参数不是字符串时,不参数化 SQL 查询是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32642706/

相关文章:

sql - 将数据从 SQL Server 表复制到同一个表

php - 这个 PHP/MySQL 语句是否容易受到 SQL 注入(inject)攻击?

mysql - 如果所有 SQL 查询都应该准备好以防止 SQL 注入(inject),那么为什么语法允许未准备好的查询呢?

c# - 微软机器人框架 : broadcast messages to users from database

c# - 在 C# 中断言权限

c# - 从 html 按钮调用 C# 函数

sql - postgres 基于多个日期值的排序

c# - 获取摩尔多瓦的区域信息

javascript - SQL Server 在一次调用中返回两次结果?

ruby-on-rails - 确保我的 SQL 未注入(inject)接收值数组