SQL参数化查询讲座 (一)

当今,大多数程序都会或多或少地使用SQL语句和数据库打交道。在程序代码中,SQL语句以字符串的形式存在,如“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘value2’ ”。这个例子以数据列param_column1param_column2的值分别为value1value2作为过滤条件,从数据表table1中查询column1column2等数据列。其中param_column1为整数类型,param_column2为字符串类型。

很多时候,value1value2的值在程序运行时才能确定,这意味着SQL语句只能在程序运行中动态生成。不少开发人员喜欢采用字符串拼凑的方式生成SQL语句,形如 “SELECT column1, column2, … FROM table1 WHERE param_column1 = ” + int_to_str( int_value  )+ “ AND param_column2 =‘ ” + str_value + “ ’ ”C程序员可能更倾向于选择格式化字符串的方式,其中格式类似于 “SELECT column1, column2,… FROM table1 WHERE param_column1 = %d AND param_column2 =‘ %s ’ ”,在实际的值代替%后,SQL语句发送给数据库引擎。

SQL执行的角度看,字符串格式化与字符串拼凑并没有太大的差别。每次查询条件稍有变化,都会向数据库提交不同的SQL语句。这些SQL语句之间虽然差别可能很小,但查询引擎每次都得重新解析,造成执行效率的降低。另外,如果上面的例子中,如果param_column1param_column2是二进制类型的数据,则要生成SQL语句显然很麻烦。更为重要的是,这种生成SQL语句的方式存在安全隐患,很容易导致SQL注入式攻击。又以上面的SQL语句为例,如果攻击者为param_column2指定的值为“ ’ OR ‘’ = ‘ ”(不包含双引号),则得到的SQL语句为“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘’ OR ‘’ = ‘’ ”,使WHERE子句形同虚设,table1中所有的记录都会查询出来。如果攻击者更缺德一点,为param_column2指定的值为“ ’;DELETE FROM table1 WHERE ‘’ = ‘”(不包含双引号),则得到的SQL语句为“SELECT column1, column2, … FROM table1 WHERE param_column1 = 0 AND param_column2 =‘’;DELETE FROM table1 WHERE ‘’ = ‘’ ”,执行之后,数据表table1就被清空了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值