我有类似下面的代码:使用locals()将参数传递给SQL查询是否安全?
var1 = 1
var2 = 2
cursor.execute("INSERT INTO mytable VALUES (:var1, :var2)", {'var1': var1, 'var2': var2})
是否有任何理由,我应该用字典文字来传递参数,而不是简单地做这样的:
var1 = 1
var2 = 2
cursor.execute("INSERT INTO mytable VALUES (:var1, :var2)", locals())
这种感觉更简单,更可以维持,但我不能动摇这里有某种安全气味的感觉。
如果查询是硬编码的,这并不是很糟糕。除非您的DBAPI库真的很可怕,否则您不会传递任何未在网上查询中命名的内容。 –
使用此方法可能会使不必要的数据进入数据库。使用字典可以更好地控制插入的内容。对你来说这可能很清楚,但只要有人开始使用你的代码,就可能发生意外的坏事。 – thepieterdc
...实际上,我*已*看到一些非常糟糕的DBAPI库;你可能想用wireshark进行实际审计。 –