psycopg2 和 SQL 注入安全

新手上路,请多包涵

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

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

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

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

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

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

原文由 wfgeo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 968
2 个回答

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

原文由 piro 发布,翻译遵循 CC BY-SA 3.0 许可协议

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 将清理您的查询。此外,如果您真的不信任用户的输入,您可以使用自己的逻辑预先清理代码中的参数。

根据 psycopg2 的文档

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

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

关于 AsIs() ,根据 psycopg2 的文档

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

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

原文由 Diego Mora Cespedes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题