在sqlite中覆盖变量列而不使用基于字符串的构造?

2024-10-02 02:43:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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注入

如果没有基于字符串的查询构造,是否可以更好地解决这个问题


Tags: key字符串inforexecutesqldatatable
1条回答
网友
1楼 · 发布于 2024-10-02 02:43:58

不能为查询的结构部分设置占位符,只能为值应该位于的插槽设置占位符

那是故意的。占位符应该保护SQL的完整性,使其不受恶意创建的值的影响,即防止SQL注入攻击。如果可以从动态输入设置查询的任意部分,占位符将无法再执行此操作

列名与SELECT关键字一样是SQL的结构部分。您需要使用字符串插值使其成为动态的Formatted strings让这变得很自然:

for column, value in data:
    cur.execute(f'UPDATE table SET {column} = ? WHERE identifier = ?;', (value, identifier))

but SQL queries shouldn't be constructed string-based.

不过,这是价值观的一条规则。字符串插值在这里也会起作用,当您已经知道正在处理的数据时,它甚至不会带来太大的风险,但这是一个坏习惯,最终您会多次使用该快捷方式。尽可能使用占位符

In this specific case, the keys are not set by the user, so SQL injection by the user is imo not possible

对。如果只使用受信任的部分,则可以安全地使SQL结构的部分成为动态的。占位符用于防止不可信的输入

相关问题 更多 >

    热门问题