python - mysqldb模块防注入设置

本文介绍如何使用mysqldb的escape_string()方法对用户输入进行转义处理,以防止SQL注入攻击。同时介绍了使用execute()方法的第二个参数进行字符串安全传递的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysqldb有处理sql语句的转义方法, 我们不用再考虑关于字符转义的问题

在接收到客户端用户发送的表单之后, 如果需要根据用户输入来获取数据, (即需要把用户提交的一些数据作为sql语句的一部分), 如果是这样的话, 我们需要对其防注入处理.


利用MySQLdb.escape_string()方法对用户输入字段进行转义

MySQLdb.escape_string()可以对用户输入进行转义处理, 以便把用户输入的数据用作sql语句的一部分.我们可以这么用

import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='', db='test')
user_keyin = 'aaa'
user_keyin = MySQLdb.escape_string(user_keyin)
cur = conn.cursor()
cur.execute("select * form table where col="+user_keyin+"")
我们先把user_keyin(用户输入)的字符串用MySQLdb.escape_string()转义,然后把它加进作为execute的参数sql语句里.

注意! MySQLdb.escape_string()在处理中文字符串的时候可能出现错误

'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

这是因为用户输入的字符串的字符集是ascll,但是ascll不支持中文, 所以我们可以把python的默认字符集改成utf-8就可以了

# 把它放到代码最前面
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


利用execute的第二个参数

这种方法更加简便.

我们可以把用户输入编为一个列表或者元组, 然后直接把它加到execute()的第二个参数里, 这样子execute就自动帮我们转义这些字符串了.看例子

#前面代码省略
# 这是有效的
cur.execute('select * from table where col=%s',(user_keyin,))

# 这是无效的,请仔细对比一下参数
cur.execute('select * from table where col=%s'% (user_keyin,))
请注意! 第一个参数是sql语句, 而需要插入user_keyin部分则用%s代替(不需要加引号), 还有一个, 如果你是用python的字符串拼接的话, 是无效的, 因为只有一个参数输入.

/* 18-1-30 更新 */
上面说到的第二种方法有一个小问题, 就是这种办法不能把表名给抽离出去, 就是说, 不应该把表名放在第二个参数里由execute方法自动组成sql语句,会报错, 这时候只能用第一种(如果需要的话)

以上!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值