C#基础 参数化SQL查询及SQL防注入原因

参数化写法

1.不使用sql参数化

string sqlStr = "select * from [Users] where UserName='" + txtUserName.Text.Trim()                  
		+ "'and Password='" + txtUserPassword.Text.Trim() + "'";

在用户名、密码框中输入1‘ or ‘1’=1’后产生的SQL语句为:

select * from [Users] where UserName='1' or '1'='1' and Password='1' or '1'='1'

而‘1’=‘1’永远是正确的。这样,用户在不知道合法的用户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进入了系统,导致我们的用户验证模块形同虚设!为了避免这种情况的发生,提高程序的安全性,需要使用参数化SQL语句。

2.使用SQL参数化

string sqlStr="select * from [Users] where UserName=@UserName and Password=@Password"

然后创建命令对象的代码时,修改为:

SqlCommand cmd = new SqlCommand(sqlStr,conn);
cmd.Parameters.AddWithValue("@UserName",txtUserName.Text.Trim());
cmd.Parameters.AddWithValue("@Password",txtUserPassword.Text.Trim());

现在,再次运行程序,在用户名和密码框中都输入‘1 or ’1‘=1’后,会提示“用户名或密码错误”,这样用户就没有办法非法登录系统

SQL防注入原因

1.原理是采用了预编译的方法,先将SQL语句中可被客户端控制的参数集进行编译,生成对应的临时变量集,再使用对应的设置方法,为临时变量集里面的元素进行赋值,赋值函数setString(),会对传入的参数进行强制类型检查和安全检查,所以就避免了SQL注入的产生。

2.参数化为我们提供了消除这种误解的能力。在遇到参数时,不管输入任何值,都将整个值作为参数的值,而不是原始 SQL 文本的一部分。

简单来说,就是把上面的sql代码变成了类似于:

select * from [Users] where UserName="1' or '1'='1" and Password="1' or '1'='1"

相当于把每个接受的参数都当成了一个整体,会从数据库中找到完全等于它的数据。
PS:以上SQL实际上不是对的,只是拿来举例

引用知乎匿名网友:
以前 WOW 有一个梗,法师在生产了一个魔法泉水的时候,队员会有一个提示 “XXXX制造了魔法泉水”。有一个货起名叫 “处女一抬腿”…结果队友出现的提示内容就是 “处女一抬腿制造了魔法泉水” 是不是有一种很恶的感觉?这就是 SQL 注入的基本原理。那怎么解决呢?用变量啊,比如,提示信息改成 “ID:1233456 制造了魔法泉水”,不就好了,管你叫什么名字呢。你的参数化查询,其实就是创建了一个变量,并且单独为这个变量赋值。

引用文章:C# 使用参数化SQL语句(防SQL注入攻击)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值