与没有注入的子串比较

时间:2017-05-03 16:43:23

标签: python sql postgresql

在python模块中生成sql-query 数据库是PostgreSQL。

在sql-query中,与子字符串进行比较:

'''
SELECT *
FROM TableTemp
WHERE "SomeColumn" LIKE '%{0}%'
'''.format(<some_string>)

如果字符串是:

%' --

然后检查将始终返回&#34; True&#34;。
另外,这是一个进行sql-injection的机会

提示,如何正确处理搜索时考虑的字符串,但是没有崩溃请求并且有sql注入?

UPD:
问题解决了。评论中的决定

1 个答案:

答案 0 :(得分:1)

您可以将字符串作为一个整体传递给psycopg2作为.execute()的第二个参数。参考:http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

import psycopg2    

conn = psycopg2.connect("dbname=test user=postgres")
curs = conn.cursor()
search_term = 'some string'
search_tuple = ('%{0}%'.format(search_term,) # note that this has to be a container
curs.execute('''select  
                from TableTemp 
                where SomeColumn like %s''',search_tuple).fetchall()

演示:

>>> conn.execute('select * from t').fetchall()
[(u'10:00',), (u'8:00',)]
>>> conn.execute('select * from t where c like ?',('%8%',)).fetchall()
[(u'8:00',)]
>>> conn.execute('select * from t where c like ?',('%:%',)).fetchall()
[(u'10:00',), (u'8:00',)]