python sql转义_在Python和sqlite中转义字符

在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/ in () OperationalError: near "Allo": syntax error

然而,这工作(删除两个地方):

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

我无法弄清楚。 我也不能排除那些引号,因为他们实际上是电影片名的一部分。 谢谢。

你这样做是错的。 从字面上看。 你应该使用这样的参数:

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环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值