神烦论坛

 找回密码
 立即注册
查看: 3882|回复: 0

sqlite参数化执行语句的使用方法

[复制链接]

86

主题

195

帖子

2026

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2026
发表于 2016-10-28 19:16:28 | 显示全部楼层 |阅读模式
在使用参数化执行语句api之前需要了解以下2点:

1 何为参数化?

        参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。


2 参数化有什么好处?
        
        参数化执行提高了数据库操作的安全性,在使用参数化执行语句的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令编译后,再套用参数运行,因此就算参数中含有具有损的指令,也不会被数据库所运行。


  举个例子:
  var data = "测试数据"
  var sql = "insert into test (name) values ('"&data&"')"  
  mysqlsqlexecsql("db_name",sql)

  当执行一条任意语句时,如果语句使用传统的字符串拼接方式,只要将 data 的数据替换为 abc');drop table test;insert into test (name) values ('def 就有可能被sql注入导致安全问题,这是为什么呢?

  因为一般的数据库执行可以执行多条语句,只要将上述替换后的字符串按分号分开就可以得到3条sql语句,这3条sql语句都合乎sql语法,然而在执行第二条语句时安全问题就发生了,test表被删除

  分解后的3条sql语句:
  into test (name) values ('abc')
  drop table test
  into test (name) values ('def')

3 百宝云参数化执行api的使用方法

  sqliteparamsqlarray(db_name,sql,param_arr,out_ret,out_rows=null)        // out_ret 返回关联数组
  sqliteparamsqlindexarray(db_name,sql,param_arr,out_ret,out_rows=null) // out_ret 返回索引数组
  sqliteparamsqljson(db_name,sql,param_arr,out_ret,out_rows=null)        // out_ret 返回json

参数说明:

  . db_name [字符型] :数据库的名字

  . param_arr [数组型] :sql语句占位符对应的参数(二维关联数组),按顺序对应sql语句里的参数占位符,如果没有参数则填入空数组 array()


  . sql [字符型] :要执行的sql语句


  . ret_arr [out , 字符型] :查询表得到的数据,以关联数组格式返回


  . out_rows [out , 整型] :返回执行sql语句操作影响的行数(对增,删,改,查都有效果),默认值为null,不接收影响的行数

  
  使用例子:


  1. function paramTest()
  2.     // 1 删除表
  3.     var sql = "drop table test"
  4.     sqliteexecsql("test.db",sql)

  5.     // 2 创建表
  6.     sql = "create table test(id integer primary key autoincrement,data_int int,data_double real,data_string varchar(100))"
  7.     sqliteexecsql("test.db",sql)
  8.     filelog("err:"&getlasterror(1))

  9.     // 3 执行参数化插入
  10.     var arr_param = array("0"=array("type"="int","value"=100),"1"=array("type"="double","value"=123.456),"2"=array("type"="string","value"="this is string"))
  11.     sql = "insert into test (data_int,data_double,data_string) values (?,?,?)"

  12.     var ret,rows
  13.     sqliteparamsqlarray("test.db",sql,arr_param,ret,rows)

  14.     // 4 查询
  15.     sql = "select * from test where data_int = ?"
  16.     arr_param = array("0"=array("type"="int","value"=100))
  17.     sqliteparamsqlarray("test.db",sql,arr_param,ret,rows)
  18.     filelog("查询ret:"&ret)
  19. end
复制代码



4 使用参数化需要注意的地方:

  sqlite数据库的参数使用 ? 占位符代表参数

  参数化执行每次只能执行一条语句


  sqlite参数化支持的数据类型有:int(整型), double(浮点型), string(字符串型)


  参数化数组是一个二维数组,其中type表示参数的类型,value表示参数的值,请注意元素的顺序,因为是按顺序插入到参数中









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术支持
关闭
售后
在线客服
QQ群:309604797
在线客服

小黑屋|神烦论坛 ( 苏ICP备18043773号 )

GMT+8, 2024-3-28 18:43

Powered by bby! X3.4

© 2015-2024 baibaoyun

快速回复 返回顶部 返回列表