首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psycopg2和SQL注入安全性

psycopg2和SQL注入安全性
EN

Stack Overflow用户
提问于 2017-07-16 21:02:19
回答 3查看 17.5K关注 0票数 14

我正在编写一个类,作为一个更大的建模算法的一部分。我的部分做空间分析,计算从某些点到其他点的距离。有各种各样的条件,包括返回距离的数量,截止距离等。

目前,项目规范只指明了硬编码的情况。即“函数#1需要列出500米范围内从点集A到点集B的所有距离。函数#2需要列出从点集C到点集D的所有距离...”诸若此类。

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

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

简单的解决方案就是按照项目中指定的方式对其进行硬编码,但这对我来说是懒惰和草率的。我不喜欢做懒惰和马虎的工作。

允许用户输入参数,并将这些参数输入到由executed copg2执行的查询中,这样做安全吗?或者仅仅是使用AsIs使它变得不安全?如果我想让用户能够输入这些参数,我是否必须自己承担责任来圣化这些输入,如果是这样的话,有没有一种快速简单的方法来做到这一点,就像使用另一个python库或其他东西一样?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-21 19:51:42

您可以使用psycopg2.sql编写动态查询。与AsIs不同的是,它将保护您免受SQL注入。

票数 5
EN

Stack Overflow用户

发布于 2017-07-16 21:10:12

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

只要不预先格式化sql查询,传递参数就不会那么不安全。从来不这样做:

代码语言:javascript
复制
sql_query = 'SELECT * FROM {}'.format(user_input)
cur.execute(sql_query)

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

取而代之的是:

代码语言:javascript
复制
sql_query = 'SELECT * FROM %s'
cur.execute(sql_query, (user_input,))

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

每个psycopg2's documentation

警告决不、决不、决不能使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。即使用枪指着也不行。

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

关于AsIs(),根据psycopg2's documentation

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

所以,不要对用户的输入使用它。

票数 29
EN

Stack Overflow用户

发布于 2020-03-10 19:03:19

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

代码语言:javascript
复制
from psycopg2 import sql


query = sql.SQL("SELECT * FROM Client where id={clientId}").format(clientId=sql.Literal(clientId)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45128902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档