我有一个JSON对象,其中包含一组“keyX”和相应的“value”
data = {
"key1": 10,
"key2": 20,
...
}
我需要将值写入数据库的“keyX”列中。 不幸的是,不能像这样格式化SQL查询:
for key in data.keys():
cur.execute('UPDATE table SET ?=? WHERE identifier=?;', (key, data[key], identifier))
因此,我现在是这样解决的:
for key in data.keys():
cur.execute('UPDATE table SET ' + key + '=? WHERE identifier=?;', (data[key], identifier))
这工作得很好,但SQL查询不应基于字符串构造。 在这种特定情况下,密钥不是由用户设置的,因此不可能由用户进行SQL注入
如果没有基于字符串的查询构造,是否可以更好地解决这个问题
不能为查询的结构部分设置占位符,只能为值应该位于的插槽设置占位符
那是故意的。占位符应该保护SQL的完整性,使其不受恶意创建的值的影响,即防止SQL注入攻击。如果可以从动态输入设置查询的任意部分,占位符将无法再执行此操作
列名与
SELECT
关键字一样是SQL的结构部分。您需要使用字符串插值使其成为动态的Formatted strings让这变得很自然:不过,这是价值观的一条规则。字符串插值在这里也会起作用,当您已经知道正在处理的数据时,它甚至不会带来太大的风险,但这是一个坏习惯,最终您会多次使用该快捷方式。尽可能使用占位符
对。如果只使用受信任的部分,则可以安全地使SQL结构的部分成为动态的。占位符用于防止不可信的输入
相关问题 更多 >
编程相关推荐