11

我在 Python 中有一些代码在 sqlite DB 中设置一个 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()
4

3 回答 3

10

从文档中:

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

这逃脱了"Joe",所以你想要的是

con.execute("insert into person(firstname) values (?)", (firstname_from_client,))
于 2012-06-08T14:10:36.557 回答
3

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

于 2012-06-08T14:10:08.080 回答
0

不...使用绑定变量!这就是他们的目的。看到这个

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

于 2012-06-08T14:06:20.810 回答