在 python 中防止 SQL 注入

Posted

技术标签:

【中文标题】在 python 中防止 SQL 注入【英文标题】:Protecting against SQL injection in python 【发布时间】:2012-06-08 14:03:20 【问题描述】:

我在 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()

【问题讨论】:

python不支持参数化查询吗? @Jeremy。是的......但任何特定数据库的python库是否支持它(他们都支持)。 是的。因此,将我的问题视为询问我所做的足以确保防止 sql 注入。 【参考方案1】:

来自文档:

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

这转义了"Joe",所以你想要的是

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

【讨论】:

我用我目前使用的代码更新了我的问题。我按照你的建议做了。这是否意味着我的代码可以安全地防止 SQL 注入? 我忘记了“转义”意味着防止 sql 注入。因为这个例子,我给了你答案。非常感谢您分享您的知识并帮助我。 如果坏人提供joe")这样的输入会有什么影响? 在这个答案中,它会将名称 joe") 插入到 firstname 列中【参考方案2】:

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

【讨论】:

感谢您的参考。我记得很久以前读过这篇文章并从那时起申请。我不知道它可以保护我免受 SQL 注入。那太棒了。我以正确的方式做到了。很抱歉没有给你答案。 Martijn 的分数比你少,他举了一个例子,这对于像我这样寻找这个问题的答案的人来说很方便。【参考方案3】:

不...使用绑定变量!这就是他们的目的。见this

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

【讨论】:

什么是 BIND 变量?有什么网址可以推荐吗?添加答案。 当然...您使用的是哪个 RDBMS? 我现在正在使用 sqlite。它还不是我的网络应用程序的生产版本。

以上是关于在 python 中防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中防止 SQL 注入

如何防止不和谐机器人python中的SQL注入攻击

Python防止sql注入

如何防止 PYTHON-DJANGO 中的 SQL 注入?

Python Flask SQLalchemy sqlite3 防止数据库搜索中的 SQL 注入

用python防止SQL注入[重复]