psycopg2和SQL注入安全性

wfg*_*geo 8 python postgresql postgis psycopg2

我正在编写一个类,用作更大的建模算法的一部分.我的部分进行空间分析来计算从某些点到其他点的距离.存在涉及返回距离,截止距离等的各种条件.

目前,项目规范仅指示硬编码情况.即"功能#1需要列出500米范围内从点集A到点集B的所有距离.功能#2需要列出从点集C到点集D的所有距离......"等等.

我不想硬编码这些参数,也不想开发模型的下一阶段的人,因为显然他们想调整参数或者可能在其他具有不同条件的项目中重复使用算法.

现在的问题是我使用psycopg2来做到这一点.这是我工作的标准,所以我没有选择偏离它.我已经读过,由于SQL注入的明显原因,公开将作为参数放入执行查询的参数是一个非常糟糕的主意.但是,我认为psycopg2会自动清理SQL输入.我认为问题在于使用该AsIs功能.

简单的解决方案就是按照项目中的规定对其进行硬编码,但这对我来说感觉很懒散.我不喜欢做懒惰和草率的工作.

允许用户输入将输入到psycopg2执行的查询中的参数是否安全?或者只是使用AsIs它使它不安全?如果我想让用户能够输入这些参数,我是否必须自己承担输入的责任,如果是这样,有一种快速简便的方法,比如使用另一个python库或什么?

Die*_*des 10

AsIs是不安全的,除非你真的知道你在做什么.例如,您可以将其用于单元测试.

只要不预先格式化sql查询,传递参数并不是不安全的.永远不会做:

sql_query = 'SELECT * FROM {}'.format(user_input)
cur.execute(sql_query)
Run Code Online (Sandbox Code Playgroud)

因为user_input可能是';DROP DATABASE;'例如.

相反,做:

sql_query = 'SELECT * FROM %s'
cur.execute(sql_query, (user_input,))
Run Code Online (Sandbox Code Playgroud)

pyscopg2将清理您的查询.此外,如果您真的不信任用户的输入,您可以使用自己的逻辑对代码中的参数进行预清理.

Per psycopg2的文件:

警告永远不要,永远不要使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串.甚至在枪口下也没有.

此外,我永远不会让我的用户告诉我应该查询哪个表.您的应用程序的逻辑(或路由)应该告诉您.

关于AsIs(),根据psycopg2文件:

Asis()...用于其字符串表示已作为SQL表示形式有效的对象.

所以,不要将它与用户的输入一起使用.


pir*_*iro 5

您可以使用psycopg2.sql来编写动态查询。不像AsIs它会保护你免受 SQL 注入。


小智 5

如果您需要将查询存储在变量中,您可以使用以下 SQL方法(文档):

from psycopg2 import sql


query = sql.SQL("SELECT * FROM Client where id={clientId}").format(clientId=sql.Literal(clientId)
Run Code Online (Sandbox Code Playgroud)