MySQLdb
Python 和DB API 都%s
用来表示替换,这可能会让人感到困惑。对于 DB API,它主要用于避免 SQL 注入攻击。在语句中,仅在需要字符串替换的地方cursor.execute()
使用才有意义。%s
例如。
您希望执行以下 sql:
CREATE TABLE foo (myfield INTEGER);
不是
CREATE TABLE 'foo' ('myfield' INTEGER);
像下面这样的东西可能是合适的:
field1_name_and_type = 'myfield VARCHAR(100)'
sql="create table %s (%s)" % (tablename, field1_name_and_type)
cur.execute(sql)
然后,当您要INSERT
进入表时,使用%s
执行语句中的 转义字符串。
my_malicious_sql = input()
cur.execute('INSERT INTO %s VALUES (%%s)' % tablename, my_malicious_sql)
在这个例子中,第一个参数 toexecute()
像这样展开,如果tablename == "foo"
:
cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)
然后,MySQLdb 库将正确地转义任何字符串my_malicious_sql
以避免 SQL 注入错误并将文本插入到数据库表中。