繁体   English   中英

在Python和sqlite中转义字符

[英]Escaping chars in Python and sqlite

我有一个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/<ipython console> in <module>()

OperationalError: near "Allo": syntax error

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

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>

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

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

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

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

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

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

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

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

我有一个简单的提示可以用来处理这个问题:当你的SQL语句字符串有单引号:'时,你可以使用双引号括起你的语句字符串。 当你的SQL语句字符串有双引号:“,那么你可以使用单引号:”来包含你的语句字符串。 例如

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

要么,

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

这个解决方案适用于Python环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM