用拼接字符串方式构造SQL语句比较容易犯sql注入问题。
常见的防范方式是以参数传入的方式处理,(把参数通过数据库提供的接口传入数据库,在数据库里面处理,而不是在数据库外面拼接SQL语句)
python 中一般是在游标执行execute时传递参数
uid=123
pwd='bb987#$!~EE'
args = (uid, pwd)
cur.execute('select * from user_table where uid = %s and pwd = %s', args )
注意:
对于传入的字符串类型的参数,在构造sql语句的模板上不需要加引号,mysql会自动转义及加引号的。
但对于string.format(参数值,参数值) 和 string % (参数值,参数值) 方式先把sql生成好再直接执行的方式,是需要手动加引号的。
uid=100
pwd='976$#@387'
cur.execute(“select * from user_table where uid = %s and pwd = %s”, (uid,pwd) )
# 上面这句pwd位置不需要加引号,sql模板和值之间是用逗号【分隔】。
# 下面这句pwd位置需要加引号, sql模板和值之间是用百分号【连接】。
cur.execute(“select * from user_table where uid = %s and pwd = '%s'” % (uid,pwd) )
但QT5的QsqlQuery的exec函数不支持这种方式。提示:too many arguments
建议使用QSqlQuery.prepare 官方文档:

本文介绍了如何在Python中使用PyQt5的QSqlQuery模块避免SQL注入问题,通过prepare()和bindValue()方法正确处理参数,确保代码安全。重点讲解了addBindValue()和bindValue()的用法以及它们在执行SQL查询时的区别。
最低0.47元/天 解锁文章
2273

被折叠的 条评论
为什么被折叠?



