dave lilley wrote:
> Sorry for posting twice but...
>
> how does the method you have given me differ to mine?
>
> eg lets say this is the scenario....
>
> uservar = "delete * from customers where * = *"
>
>
>>> e.g. stmt = "select * from customers where cust_no = #{uservar}"
>>> row = db.execute(stmt)
>>>
>
> Now i could understand how my code could possibly allow the records in the
> table to be deleted but what's the difference to the code you gave me?
>
> stmt = "select * from customers where cust_no = ?"
>
> row = db.execute(stmt, uservar)
>
>
> Also I've just notice that you've used the variable as a parameter where in
> my 1st reply I didn't have it - my failure to really look at the code.
>
require 'sqlite3'
db = SQLite3::Database.new(':memory:')
db.execute_batch(<<eof)
begin transaction;
create table foo (
foo_oid integer primary key autoincrement,
bar varchar
);
insert into foo values (null, 'wibble')
eof
db.execute2('select * from foo where foo_oid=?', 1) do |line|
p line
end
["foo_oid", "bar"]
["1", "wibble"]
injection = '4;delete from foo'
db.execute_batch('select * from foo where foo_oid=?', injection)
db.execute2('select * from foo where foo_oid=?', 1) do |line|
p line
end
["foo_oid", "bar"]
["1", "wibble"]
db.execute_batch("select * from foo where foo_oid=#{injection}")
db.execute2('select * from foo where foo_oid=?', 1) do |line|
p line
end
["foo_oid", "bar"]
The difference is that by using this form...
db.execute(sql,bind_arg_1,bind_arg_2,bind_arg_n)
...you are internally using sqlite3_bind_xxx. See
http://www.sqlite.org/c3ref/funclist.html and check the sqlite3_bind_xxx
documentation for more details.
John
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users