为了一个请求保护

时间:2014-07-25 16:12:32

标签: python sql sqlite

我有这样的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()

另外,我在一个线程中这样做,所以我不容易调试信息

1 个答案:

答案 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注入攻击并允许数据库缓存并重用它生成的任何查询计划。

请参阅sqlite3 documentation

  

通常,您的SQL操作需要使用Python变量中的值。你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以获取可能出错的幽默示例)。

     

相反,请使用DB-API的参数替换。将?作为占位符放在要使用值的位置,然后提供值元组作为游标execute()方法的第二个参数。 (其他数据库模块可能使用不同的占位符,例如%s或:1。)