'select id,username from front_user where id=%s' % user_id
如果用户输入的是1 or 1=1,会将front_user表中的所有数据提取出来
防御
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双'-'进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 不要使用管理员权限的数据库连接,为每个应用使用单独的权限进行数据库连接
- 不要把机密信息直接存放,加密或者hash掉密码或敏感信息
在Django中如何防御sql注入
- 使用ORM来做数据的增删改查。因为ORM使用的是参数化的形式执行sql语句的。
- 如果万一要执行原生sql语句,那么建议不要拼接url,而是使用参数化的形式
参数化sql查询
这里 execute 执行的时候传入两个参数,第一个是参数化的sql语句,第二个是对应的实际的参数值,函数内部会对传入的参数值进行相应的处理防止sql注入,
用字典传参
import pymysql db_mysql_config={ 'host':'', 'port':3306, 'user':'root', 'password':'', 'charset':'utf8', 'db':'' } conn = pymysql.connect(**db_mysql_config) cur = conn.cursor(cursor=pymysql.cursors.DictCursor) dict_parm = {"xn": "2015", "xq": "上学期"} sql = """ SELECT xm FROM edu_app_xqfx_jscq_js WHERE xn = %(xn)s AND xq = %(xq)s AND xm IS NOT NULL LIMIT 3 """ cur.execute(sql,dict_parm) rows=cur.fetchall() for row in rows: print(row) conn.commit() cur.close() conn.close()
用列表传参
import pymysql db_mysql_config={ 'host':'', 'port':3306, 'user':'root', 'password':'', 'charset':'utf8', 'db':'' } conn = pymysql.connect(**db_mysql_config) cur = conn.cursor(cursor=pymysql.cursors.DictCursor) dict_parm = {"2015","上学期"} sql = """ SELECT xm FROM edu_app_xqfx_jscq_js WHERE xn = %s AND xq = %s AND xm IS NOT NULL LIMIT 3 """ cur.execute(sql,dict_parm) rows=cur.fetchall() for row in rows: print(row) conn.commit() cur.close() conn.close()
结果为{'xm':'小明'}
执行mysql默认是元组格式,当pymysql.cursors.DictCursor,查询时,返回字典
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
本文来源于:python之sql注入-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论