在数据库查询字符串中转义引号的好方法?

Jon*_*ior 31 python database sql-injection escaping

我已经尝试了各种各样的Python模块,它们要么逃避太多,要么以错误的方式逃脱.你在Python中找到逃避引号(",")的最佳方法是什么?

Dav*_*ebb 29

如果它是数据库查询的一部分,您应该能够使用参数化SQL语句.

除了转义引号外,这将处理所有特殊字符并保护您免受SQL注入攻击.

  • +1:如果您在数据库查询中转义引号,则表示SQL错误. (16认同)
  • 为什么需要Python 3.0才能使用参数化的SQL语句?它们存在于所有版本和所有Postgres Python界面中. (3认同)
  • 并不是所有的东西都可以参数化。特别是当您尝试动态构建 SQL 查询时。就像动态表名称或动态运算符一样,根据布尔值使用“>”或“<”。或者具有不同数量的参数。 (3认同)
  • @S.Lott 你能解释一下原因吗?您是否有比转义引号更好/更清洁的方法的链接? (2认同)

edd*_*e_c 22

使用json.dumps.

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"
Run Code Online (Sandbox Code Playgroud)

  • 当Unicode字符包含在字符串中时,这会失败:`print json.dumps(u"£")`print`"\ u00a3"` (4认同)

Gre*_*egD 8

转义字符串以及将其他对象转换为编程形式的简单和标准方法是使用repr()函数中的构建.它将对象转换为您需要使用手动代码输入的对象.

例如:

s = "I'm happy I am \"here\" now"
print repr(s)
>>  'I\'m happy I am "here" now'
Run Code Online (Sandbox Code Playgroud)

没有奇怪的黑客,它是内置的,它只适用于大多数用途.

  • 这可能不是OP想要的.repr确实转义了引号,但它也将字符串包装在单引号中.例如:repr("国王的城堡")变成''国王的城堡''(注意包装引号). (4认同)

ex4*_*ex4 5

如果使用 psycopg2,其execute()方法具有内置转义:

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))
Run Code Online (Sandbox Code Playgroud)

请注意,您为执行方法提供了两个参数(字符串和元组),而不是使用 Python 的 % 运算符来修改字符串。

答案从这里窃取:psycopg2相当于mysqldb.escape_string?


Roy*_*Roy 5

三重单引号可以方便地封装 SQL 查询中经常使用的单引号:

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
Run Code Online (Sandbox Code Playgroud)