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语句,会报错, 这时候只能用第一种(如果需要的话)
以上!