在Python和sqlite中转义字符
我有一个python脚本读取原始电影文本文件到sqlite数据库。
我使用re.escape(title)在执行插入操作之前将转义字符添加到string中以使它们安全。
为什么这不起作用:
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(标题)来添加转义字符到string,使他们的数据库安全
请注意, re.escape
使string重新安全 – 与使数据库安全无关。 相反,正如@Donal所说的,你需要的是Python DB API的参数replace概念 – 这使得“db安全”成为你需要的东西。
SQLite不支持反斜杠转义序列。 string文字中的撇号通过加倍表示: '''Allo ''Allo! (1982)'
'''Allo ''Allo! (1982)'
。
但是,像Donal说的,你应该使用参数。
我有一个简单的提示,你可以用来处理这个问题:当你的SQL语句string有单引号:',那么你可以使用双引号括住你的语句string。 而当你的SQL语句string有双引号:“,那么你可以用单引号:”来包围你的语句string。 例如
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)
这个解决scheme适用于Python环境。