psycopg2与SQL注入安全

2024-05-21 00:41:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个类,作为更大的建模算法的一部分。我的部分进行空间分析,计算从某些点到其他点的距离。有多种情况,包括返回距离的数目、截止距离等

目前,项目规范只指出硬编码的情况。i、 e.“函数#1需要列出500米范围内从点集A到点集B的所有距离。函数#2需要列出从点集C到点集D的所有距离…”等。

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

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

简单的解决方案是按照项目中的指定对其进行硬编码,但这对我来说既懒又邋遢。我不喜欢做又懒又邋遢的工作。

允许用户输入将被输入到psycopg2执行的查询中的参数是安全的吗?或者只是使用AsIs使其不安全?如果我想让用户能够输入这些参数,我是否必须自己承担责任来对输入进行santiize,如果是的话,是否有一种快速而简单的方法来实现它,就像使用另一个python库或其他什么东西一样?


Tags: 项目函数用户规范算法距离编码sql
2条回答

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

只要不预先格式化sql查询,传递参数并不是那么不安全。永远不要:

sql_query = 'SELECT * FROM {}'.format(user_input)
cur.execute(sql_query)

例如,因为user_input可以是';DROP DATABASE;'

相反,请:

sql_query = 'SELECT * FROM %s'
cur.execute(sql_query, (user_input,))

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

^{}'s documentation

Warning Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.

而且,我永远不会让我的用户告诉我应该查询哪个表。你的应用程序的逻辑(或路由)应该告诉你这一点。

关于AsIs(),根据^{}'s documentation

Asis()... for objects whose string representation is already valid as SQL representation.

所以,不要在用户输入时使用它。

可以使用psycopg2.sql组合动态查询。与AsIs不同,它将保护您不受SQL注入的影响。

相关问题 更多 >