我被告知以下内容存在不安全性:
cursor.execute("""SELECT currency FROM exchange_rates WHERE date='%s'"""%(self.date))
为什么'%s'
是不好的?有人会如何进行SQL注入攻击?
self.date
的值为"'; DROP TABLE exchange_rates --"
。那么你将会执行以下代码:SELECT currency FROM exchange_rates WHERE date=''; DROP TABLE exchange_rates -- '
,结果会出现问题。你需要对'
进行转义,这样self.date
的值就会完整地包含在字符串中,而不是作为查询语句被执行。cursor.execute("SELECT currency FROM exchange_rates WHERE date=?", self.date)
;
放入值中(编辑:具体来说,用 '
关闭引号,然后添加分号),然后尝试在其后注入其他查询,那么将直接执行。通过单独传递值,您确保数据只被视为数据,并且不作为查询执行。
self.date
可能包含的内容。但最好的做法是正确传递查询参数 - 这并不需要额外的努力。 - John La Rooy