在 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 注入的主要内容,如果未能解决你的问题,请参考以下文章