python sql注入防护

SQL注入防范

以前对代码的安全程度不够注重,其实也可以说是没那么多参考资料来指导,没那么严格的流程来要求。现在分享一下自己的代码安全方面的收获。

sql注入指通过构造不符合预期的sql语句,来达到绕过防范的目的。
例子就不举例了。网上太多。
说说python中的防范方法。

django

ORM框架
django模型提供了一套自动生成的用于数据库操作的API,直接对对象进行操作。
一般使用的方法有:filter()、get()、all()。
但不可避免的使用mysql语句的。
django中可以通过Manager.raw()方法,进行查询且返回实例。
Manager.raw(raw_query, params=None, translations=None)
通过向raw()方法传递params参数进行查询。
可以这样用,例如:
person.objects.raw(“SELECT name, age FROM person_info WHERE sex = %s”, [name])
这些方法都是能避免sql注入的,推荐方法。

原生sql

如果在代码中完全避开了django的模型层,直接执行sql语句,那么就要防范sql注入了。
向sql语句传递参数的方法:

例如:
import MySQLdb as mysqldb
db = mysqldb.connect(“localhost”, “username”, “password”, “table”)
cursor = db.cursor()

1.使用逗号

使用mysqldb的内置方法execute作为参数传入,这样一般不会存在sql注入。
name = “root”
select_sql = “SELECT * FROM user WHERE name = %s”
cursor.excute(select_sql, name)

2.使用字典

select_sql = SELECT * FROM user WHERE name = %(name)s"
value_dict = {“name”: “root”}
cursor.execute(select_sql, value_dict)

format()拼接

传参

name = “root”
age = 10
select_sql = ‘SELECT * FROM user WHERE name="{}" AND age="{}"’.format(name, age)
cursor.excute(select_sql)

字典

select_sql = ‘SELECT * FROM user WHERE name="{name}" AND age="{age}’.format(name=“root”, age=10)

百分号占位符%

不推荐使用,包含某些特殊字符时,不能正常解析。甚至可能会注入。

你可能感兴趣的:(python,mysql)