具有LIKE子句的Pyscopg2 SQL注入安全性

时间:2018-12-04 10:00:18

标签: python sql postgresql psycopg2

我必须进行一个查询,该查询包含带有通配符'%'的SQL LIKE子句。它还具有用户输入数据。

查询的形式:

SELECT * FROM my_table
WHERE x = <user_input>
AND y NOT LIKE '%abc%'

如何在Python的psycopg2模块中做到这一点?

以下代码不起作用:

cur.execute(
    """SELECT * FROM my_table
    WHERE x = %s
    AND y NOT LIKE '%abc%'
    """, (user_input,)
)

可能是由于LIKE子句中的通配符。

关于我应该如何做的任何建议?预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以简单地通过变量传递模式,例如:

MyModel.db['CALL get_info("arg")').first
# => {col: val, col2: val}
MyModel.db['CALL get_info("arg")').first
# => Sequel::DatabaseDisconnectError: Mysql2::Error: Commands out of sync; you can't run this command now
from /usr/local/lib/ruby/gems/2.3.0/gems/mysql2-0.4.5/lib/mysql2/client.rb:120:in `_query'

或者,通过将模式中的pattern = '%abc%' cursor.execute( """SELECT * FROM my_table WHERE x = %s AND y NOT LIKE %s """, (user_input, pattern) ) 字符加倍来对其进行转义(因此该函数不会将它们视为占位符):

%