防止Python中的SQL注入

问题描述 投票:0回答:3

我有一些 Python 代码在 sqlite 数据库中设置 char(80) 值。

该字符串直接从用户通过文本输入字段获取,并以 JSON 结构通过 POST 方法发送回服务器。

在服务器端,我当前将字符串传递给调用 SQL UPDATE 操作的方法。

它有效,但我知道它一点也不安全。

我预计客户端无论如何都是不安全的,因此任何保护都应该放在服务器端。我该怎么做才能确保 UPDATE 操作免受 SQL 注入的影响?

我正在寻找一个可以“引用”文本的函数,这样它就不会混淆 SQL 解析器。我期望这样的功能存在,但找不到它。

编辑: 这是我当前设置字符字段名称标签的代码:

def setLabel( self, userId, refId, label ):
    self._db.cursor().execute( """
        UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", ( label, userId, refId) )
    self._db.commit()
sql python-2.7 security
3个回答
12
投票

来自文档:

con.execute("insert into person(firstname) values (?)", ("Joe",))

这逃脱了

"Joe"
,所以你想要的是

con.execute("insert into person(firstname) values (?)", (firstname_from_client,))

4
投票

DB-API 的

.execute()
支持参数替换,它将为您处理转义,它在文档顶部附近提到; http://docs.python.org/library/sqlite3.html 上面永远不要这样做——不安全


1
投票

不...使用绑定变量!这就是他们存在的目的。请参阅这个

该技术的另一个名称是参数化sql(我认为“绑定变量”可能是专门用于Oracle的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.