Python中防止SQL注入攻击

15
我有一段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()

Python不支持参数化查询吗? - Jeremy Holovacs
@Jeremy。是的...但实际上这取决于Python库是否支持特定数据库(据我所知,它们都支持)。 - Gerrat
是的。所以请把我的问题看作是在询问,我所做的是否足以确保防止 SQL 注入攻击。 - chmike
3个回答

12

来自文档:

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

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

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

我已经更新了我的问题,并附上了我目前使用的代码。我按照你的建议进行了修改。这是否意味着我的代码已经安全,不会受到 SQL 注入攻击? - chmike
我忘记了“转义”是指防止 SQL 注入攻击。我给出了答案,因为有了这个例子。非常感谢您分享知识并帮助我。 - chmike
如果恶意用户输入 joe"),那会产生什么影响? - OakenDuck
在这个答案中,它将把名称 joe 插入到 firstname 列中。 - Martijn

4

谢谢你提供的参考资料。我现在记得很久以前读过它,并且一直在应用它。我不知道它可以保护我免受SQL注入攻击,这太好了。我是按照正确的方式做的。抱歉没有给你答案。Martijn比你得分低,他给出的例子对像我这样寻找答案的人很有用。 - chmike

1

不要...使用绑定变量!这就是它们存在的原因。请参见this

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


1
什么是绑定变量?有什么推荐的URL吗?请添加答案。 - chmike
当然可以...你使用哪种关系型数据库管理系统? - Gerrat
我目前正在使用sqlite。这还不是我的Web应用程序的生产版本。 - chmike
具有讽刺意味的是,我甚至找不到关于如何在Python中使用变量绑定的信息。你有相关信息的链接吗?我以前总是在其他语言中这样做。 - JamesHoux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接