我在MySQLdb python驱动程序的幕后略微偷看,令我惊恐的是,我看到它只是escaping the parameters and putting them directly into the query string。我意识到在大多数情况下转换输入应该没问题,但是来自PHP,我已经看到了错误,鉴于某些数据库字符集和MySQL驱动程序的版本,SQL注入仍然是可能的。
This question对PHP中字符串转义的边缘情况做了一些非常详细的回答,并使我相信应尽可能使用预处理语句。
那么我的问题是:是否有任何已知的MySQLdb驱动程序被成功利用的情况?当需要在循环中运行查询时(例如,在增量数据库迁移脚本的情况下),这会降低性能吗?我对逃脱输入的担忧是否存在根本缺陷?
答案 0 :(得分:0)
......应尽可能使用准备好的陈述。
是。这是最好的建议。如果准备好的声明系统被破坏,将会有来自屋顶的喇叭声响起,Python世界中的每个人都会突然发现问题来修复它。如果你自己的代码中有一个错误,那就是你没有使用准备好的语句。
您在驱动程序中看到的可能是准备语句 emulation ,即驱动程序负责将数据插入占位符并将最终的组合语句转发给服务器。这是出于各种原因,有些是历史性的,有些是与兼容性有关。
司机通常会受到严格的审查,因为它们是大多数系统的基础。如果那里存在安全漏洞,那么会有很多人受到它的影响,赌注非常高。
使用带有占位符值的预准备语句和您自己的插值代码之间的区别很大,即使幕后发生同样的事情也是如此。这是因为驱动程序按设计总是转义数据。你的代码可能没有,你可以省略一个值的转义然后你有一个灾难性的漏洞。
使用占位符值,就像你的生活取决于它,因为它很可能。你不想有一天醒来打电话或发电子邮件说你的网站被黑了,现在你的数据库在互联网上浮动。
答案 1 :(得分:0)
我无法指出任何已知的漏洞利用案例,但我可以说是的,这很糟糕。
不再维护调用自身MySQLdb的Python项目。自2014年以来,它一直在堆积未解决的Github问题,并且只是快速查看源代码,我可以找到更多尚未报告的错误 - 例如,它使用正则表达式解析execute_many
中的查询,导致它错误处理任何问题在" values()"
不是关键字的情况下使用字符串values
进行查询。
而不是MySQLdb,你应该使用MySQL的Connector/Python。那个仍然是,并且希望它比MySQLdb更糟糕。 (希望。我没有检查那个。)
答案 2 :(得分:-1)
使用预准备语句比连接查询更快。数据库可以预编译语句,因此在循环中迭代时只会更改参数。