Python安全开发之SQL注入

PHP中使用的预编译在python中同样适用,同样可以用预编译来防止python编码中的SQL注入问题。

错误用法:

1
2
sql = "select id,name from user where id = %s and name = %s" % (id, name)
cur.execute(sql)

这种用法就是常见的拼接字符串导致sql注入漏洞的产生。

正确用法:

1
2
args = (id, name)
cur.execute('select id,name from user where id = %s and name = %s', args )

使用如此参数带入方式,python会自动过滤args中的特殊字符,制止SQL注入的产生。

execute()函数本身就有接受SQL语句变量的参数位,可以通过python自身的函数处理sql注入问题,只要正确的使用(即:使用”逗号”,而不是”百分号”)就可以对传入的值进行正确的转义,从而避免SQL注入的发生。

For Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table people (name, age)")
who = "test"
age = 22
# This is the qmark style:
cur.execute("insert into people values (?, ?)", (who, age))
# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})
print cur.fetchone()

参考文章:
http://xlixli.net/?p=377
http://www.cnblogs.com/sevck/p/6733702.html
https://crazyof.me/blog/archives/2224.html

大爷,赏个铜板呗!