我有这样的SQL请求:
"INSERT INTO pirate(title, title_simple, user, magnet_link, \
url, created, size, infos, images, description, number, response, new) VALUES
(\"{0}\", \"{1}\", \"{2}\", \"{3}\", \
\"{4}\", \"{5}\", \"{6}\", \"{7}\", \"{8}\", \"{9}\", \"{10}\", \"{11}\", \"{12}\")".format(blablabla...)
但是我的查询的一些参数是大量的文本,大多像描述。有时文本中会出现这个字符:"
我已经尝试保护我在查询中使用的字符串,使用以下语法作为示例:
\"{9}\"
但它不适用于"
。你对如何解决我的基本问题有什么想法,有什么好办法呢?
编辑:
@Martijn Pieters:我试过但它不起作用:
requete = "INSERT INTO pirate(title, title_simple, user, magnet_link, \
url, created, size, infos, images, description, number, response, new) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
params = (torrent.title, simpleChar(torrent.title), torrent.user, torrent.magnet_link,
str(torrent.url), torrent.created, strByteToOctet(torrent.size)[1],
str_infos, str_images, torrent.info, torrent.id, retours, True)
bdd = sqlite3.connect("fichiers.sqlite")
bdd.row_factory = sqlite3.Row
c = bdd.cursor()
c.execute(requete, params)
bdd.commit()
c.close()
bdd.close()
另外,我在一个线程中这样做,所以我不容易调试信息
答案 0 :(得分:2)
将值转义为数据库适配器。请改用SQL参数,不字符串格式:
query = """\
INSERT INTO pirate(
title, title_simple, user, magnet_link,
url, created, size, infos, images, description, number, response, new)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
params = (pirate_title, simplify(pirate_title), userid, link, url,
datetime.now(), 0, torrent_infos, torrent_images, desc,
42, response, True)
cursor.execute(query, params)
使用SQL参数委托转义给专家,防止SQL注入攻击并允许数据库缓存并重用它生成的任何查询计划。
通常,您的SQL操作需要使用Python变量中的值。你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以获取可能出错的幽默示例)。
相反,请使用DB-API的参数替换。将
?
作为占位符放在要使用值的位置,然后提供值元组作为游标execute()
方法的第二个参数。 (其他数据库模块可能使用不同的占位符,例如%s或:1。)