防止python中的SQL注入

防止python中的SQL注入,sql,python-2.7,security,Sql,Python 2.7,Security,我有一些Python代码在sqlite DB中设置char(80)值 该字符串通过文本输入字段直接从用户处获得,并通过JSON结构中的POST方法发送回服务器 在服务器端,我当前将字符串传递给调用SQL更新操作的方法 它是有效的,但我知道它一点也不安全 我认为客户端无论如何都是不安全的,所以任何保护都要放在服务器端。我可以做些什么来保护针对SQL注入的更新操作 我正在寻找一个函数,它可以“引用”文本,这样就不会混淆SQL解析器。我希望这样的函数存在,但找不到它 编辑: 以下是我当前设置字符字段名

我有一些Python代码在sqlite DB中设置char(80)值

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

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

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

我认为客户端无论如何都是不安全的,所以任何保护都要放在服务器端。我可以做些什么来保护针对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()

不。。。使用绑定变量!这就是他们在那里的目的。看


该技术的另一个名称是(我认为“bind variables”可能是Oracle专门使用的名称)。

DB-API的
.execute()
支持参数替换,这将为您解决转义问题,它在文档顶部附近提到;上述操作永远不会执行--不安全。

来自文档:

con.execute("insert into person(firstname) values (?)", ("Joe",))
这会逃逸“Joe”,因此您需要的是

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

什么是绑定变量?有什么建议吗?添加一个答案。当然……您使用的是哪种RDBMS?我现在正在使用sqlite。它还不是我的web应用的生产版本。python不支持参数化查询吗?@Jeremy。是的……但真正的问题是任何特定数据库的python库是否支持它(他们都支持)。是的。因此,考虑我的问题,问我所做的是否足以确保对SQL注入的保护。我用我目前使用的代码更新了我的问题。我按照你的建议做了。这是否意味着我的代码对SQL注入是安全的?我忘记了“转义”意味着对SQL注入是安全的。因为这个例子,我给了你答案。非常感谢您分享您的知识并帮助我。如果坏演员提供输入,如
joe”)
会有什么影响?在这个答案中,它会在firstname列中插入名称
joe”)
,谢谢您的参考。我记得很久以前读过这篇文章,从那时起就开始申请了。我不知道它在保护我免受SQL注入的影响。太好了。我做得对。很抱歉没有给你答案。Martijn的分数比你少,他举了一个例子,这对像我这样寻找这个问题答案的人来说很方便。