当前位置:  开发笔记 > 编程语言 > 正文

在Python和sqlite中转义字符

如何解决《在Python和sqlite中转义字符》经验,为你挑选了3个好方法。

我有一个python脚本,将原始电影文本文件读入sqlite数据库.

我使用re.escape(title)将转义字符添加到字符串中,以使它们在执行插入之前安全.

为什么这不起作用:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError                       Traceback (most recent call last)

/home/rajat/Dropbox/amdb/ in ()

OperationalError: near "Allo": syntax error

然而,这有效(在两个地方删除):

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: 

我无法弄清楚.我也不能放弃这些主流报价,因为它们实际上是电影片头的一部分.谢谢.



1> Donal Fellow..:

你这样做是错的.从字面上看.您应该使用参数,如下所示:

c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))

就像那样,你根本不需要做任何引用(如果那些值来自任何不受信任的人)你也将100%安全(这里)来自SQL注入攻击.


请注意,这些参数仅适用于值.例如,它们不适用于列名.引用可能是一个问题但有时仍然是必要的.
绝对.引用和转义是最后资源的克拉德.如果参数可用,请使用_always_
顺便说一下,同样的想法也适用于几乎所有其他值得称赞的数据库,以及几乎所有其他实用的编程语言.*每个人*都是这样做的,因为它是*对*.

2> Alex Martell..:

我使用re.escape(title)将转义字符添加到字符串中以使它们安全

注意,re.escape使字符串重新安全- 与使数据库安全无关.相反,正如@Donal所说,你需要的是Python DB API 的参数替换概念 - 可以根据需要使"数据库安全".



3> dan04..:

SQLite不支持反斜杠转义序列.字符串文字中的撇号通过加倍来表示:'''Allo ''Allo! (1982)'.

但是,就像Donal所说,你应该使用参数.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有