|
在使用参数化执行语句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,不接收影响的行数
使用例子:
- function paramTest()
- // 1 删除表
- var sql = "drop table test"
- sqliteexecsql("test.db",sql)
- // 2 创建表
- sql = "create table test(id integer primary key autoincrement,data_int int,data_double real,data_string varchar(100))"
- sqliteexecsql("test.db",sql)
- filelog("err:"&getlasterror(1))
- // 3 执行参数化插入
- 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"))
- sql = "insert into test (data_int,data_double,data_string) values (?,?,?)"
- var ret,rows
- sqliteparamsqlarray("test.db",sql,arr_param,ret,rows)
- // 4 查询
- sql = "select * from test where data_int = ?"
- arr_param = array("0"=array("type"="int","value"=100))
- sqliteparamsqlarray("test.db",sql,arr_param,ret,rows)
- filelog("查询ret:"&ret)
- end
复制代码
4 使用参数化需要注意的地方:
sqlite数据库的参数使用 ? 占位符代表参数
参数化执行每次只能执行一条语句
sqlite参数化支持的数据类型有:int(整型), double(浮点型), string(字符串型)
参数化数组是一个二维数组,其中type表示参数的类型,value表示参数的值,请注意元素的顺序,因为是按顺序插入到参数中
|
|