如何使用pythondbapi安全地生成类似sql的语句

hrirmatl  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(253)

我正在尝试使用python的db api组装以下sql语句:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

其中,字符串的开头应该是python变量,以便通过db api安全地填充。我试过了

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

我没有主意了;正确的方法是什么?

kqhtkvqz

kqhtkvqz1#

注意sqlite3文档:
通常,sql操作需要使用python变量中的值。您不应该使用python的字符串操作来组装查询,因为这样做是不安全的;它使您的程序易受sql注入攻击。
相反,使用dbapi的参数替换。放?作为占位符,然后提供一个值元组作为游标execute()方法的第二个参数(其他数据库模块可能使用不同的占位符,例如%s或:1。)例如:


# Never do this -- insecure!

symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead

t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example

for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

我想你想要这个:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
kpbpu008

kpbpu0082#

如果可以,最好将参数与sql分开。然后您可以让db模块负责正确引用参数。

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
qzlgjiam

qzlgjiam3#

编辑:
正如brian和thomas所指出的,更好的方法是使用:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

因为第一种方法使您容易受到sql注入攻击。
历史遗留问题:
尝试:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)

相关问题