Python 使用psycopg2在Django中保护原始SQL查询
我正在使用django框架创建一个web应用程序。在其中一个SQL查询中,我必须连接多个表,并使用用户输入作为“where”子句的一部分来获取结果。由于查询相当复杂,我选择使用原始SQL而不是django框架 查询的简化形式为:Python 使用psycopg2在Django中保护原始SQL查询,python,sql,django,security,sql-injection,Python,Sql,Django,Security,Sql Injection,我正在使用django框架创建一个web应用程序。在其中一个SQL查询中,我必须连接多个表,并使用用户输入作为“where”子句的一部分来获取结果。由于查询相当复杂,我选择使用原始SQL而不是django框架 查询的简化形式为: select * from table where {where_clause} where_子句的形式可能是col1>100和col2>50以及col3让用户定义(甚至知道)您的表/列名称似乎一开始就不安全 我将创建一些允许值的dict,用户可以通过该映射过滤到数据
select * from table where {where_clause}
where_子句
的形式可能是col1>100和col2>50以及col3让用户定义(甚至知道)您的表/列名称似乎一开始就不安全
我将创建一些允许值的dict,用户可以通过该映射过滤到数据库中的实际表(所以用户不知道您的数据库列名)
然后,与其让用户写“>”,不如让用户定义(甚至知道)您的表/列名称,这似乎一开始就不安全
我将创建一些允许值的dict,用户可以通过该映射过滤到数据库中的实际表(所以用户不知道您的数据库列名)
然后,不再让用户写'>',注意到。这与我所做的有些相似。但您认为这足以阻止SQL注入吗?是的,只要您使用“格式”方法而不是插值来直接查询字符串。原因用户仍有可能通过“值”参数提供恶意代码。这与我所做的有些相似。但您认为这足以阻止SQL注入吗?是的,只要您使用“格式”方法而不是插值来直接查询字符串。原因用户仍有可能通过“值”参数提供恶意代码
query = sql.SQL("select {field} from {table} where {pkey} = %s").format(
field=sql.Identifier('my_name'),
table=sql.Identifier('some_table'),
pkey=sql.Identifier('id'))