我正在编写一个类,作为一个更大的建模算法的一部分。我的部分做空间分析,计算从某些点到其他点的距离。有各种各样的条件,包括返回距离的数量,截止距离等。
目前,项目规范只指明了硬编码的情况。即“函数#1需要列出500米范围内从点集A到点集B的所有距离。函数#2需要列出从点集C到点集D的所有距离...”诸若此类。
我不想硬编码这些参数,开发模型下一阶段的人也不想,因为很明显,他们想要调整参数,或者可能在其他项目中重用算法,因为他们会有不同的条件。
现在的问题是,我正在使用psycopg2来做这件事。这是我工作的标准,所以我没有背离它的选择。我读到过,由于SQL注入的明显原因,公开将作为参数放入执行查询中的参数是一个非常糟糕的主意。然而,我认为psycopg2会自动清理SQL输入。我认为问题出在使用AsIs函数。
简单的解决方案就是按照项目中指定的方式对其进行硬编码,但这对我来说是懒惰和草率的。我不喜欢做懒惰和马虎的工作。
允许用户输入参数,并将这些参数输入到由executed copg2执行的查询中,这样做安全吗?或者仅仅是使用AsIs使它变得不安全?如果我想让用户能够输入这些参数,我是否必须自己承担责任来圣化这些输入,如果是这样的话,有没有一种快速简单的方法来做到这一点,就像使用另一个python库或其他东西一样?
发布于 2017-07-21 19:51:42
您可以使用psycopg2.sql编写动态查询。与AsIs不同的是,它将保护您免受SQL注入。
发布于 2017-07-16 21:10:12
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's documentation
警告决不、决不、决不能使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。即使用枪指着也不行。
此外,我永远不会让我的用户告诉我应该查询哪个表。你的应用程序逻辑(或路由)应该会告诉你这一点。
关于AsIs(),根据psycopg2's documentation:
Asis()...用于其字符串表示形式已作为SQL表示形式有效的对象。
所以,不要对用户的输入使用它。
发布于 2020-03-10 19:03:19
如果需要将查询存储在变量中,可以使用SQL方法(documentation):
from psycopg2 import sql
query = sql.SQL("SELECT * FROM Client where id={clientId}").format(clientId=sql.Literal(clientId)https://stackoverflow.com/questions/45128902
复制相似问题