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

时间:2009-05-22 09:16:29

标签: python database escaping sql-injection

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

9 个答案:

答案 0 :(得分:27)

如果它是数据库查询的一部分,您应该能够使用Parameterized SQL Statement

除了转发你的报价外,这还会处理所有特殊字符并保护你免受SQL injection attacks的侵害。

答案 1 :(得分:22)

使用json.dumps

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"

答案 2 :(得分:9)

转义字符串并将其他对象转换为编程形式的简单而标准的方法是使用build in repr()函数。它将对象转换为您需要使用手动代码输入的对象。

E.g:

s = "I'm happy I am \"here\" now"
print repr(s)
>>  'I\'m happy I am "here" now'

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

答案 3 :(得分:2)

如果您使用的psycopg2具有转义字符串的方法: psycopg2.extensions.adapt() 请参阅How to quote a string value explicitly (Python DB API/Psycopg2)获取完整答案

答案 4 :(得分:2)

回复旧帖子,但这里仍然缺少最好的方法..

如果使用psycopg2,它的执行-method有buildin转义。

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))

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

从这里偷来的答案:psycopg2 equivalent of mysqldb.escape_string?

答案 5 :(得分:2)

三个单引号将方便地封装SQL查询中经常使用的单引号:

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

答案 6 :(得分:1)

三重双引号最适合转义:

string = """This will span across 'single quotes', "double quotes",
and literal EOLs all in the same string."""

答案 7 :(得分:0)

对于更通用的问题的解决方案,我有一个程序,我需要将任何字符集存储在平面文件中,以制表符分隔。显然,在'set'中设置标签会导致问题。

而不是output_f.write(str),我使用了output_f.write(repr(str)),这解决了我的问题。 读取速度较慢,因为我需要在读取时eval()输入,但总的来说,它使代码更清晰,因为我不再需要检查边缘情况了。

答案 8 :(得分:0)

对于我的用例,我在数据库中保存了一个段落,该段落中的某处可能有一些带有单引号(example: Charlie's apple sauce was soggy)的文本

我发现这最有效:

database_cursor.execute('''INSERT INTO books.collection (book_name, book_quoted_text) VALUES ('%s', "%s")''' % (book_name, page_text.strip()))

您会注意到,在将INSERT语句包装在""中之后,我使用了'''