提问人:Titan31 Hunter29 提问时间:10/31/2022 最后编辑:Titan31 Hunter29 更新时间:10/31/2022 访问量:1309
使用 F 字符串请求数据会导致 SQL 注入吗?[复制]
Will using F-strings to request data cause SQL injections? [duplicate]
问:
我不熟悉注入攻击的工作原理。如果我只请求数据(而不是更新/插入),在 .execute() 中使用 f 字符串会让我容易受到注入吗?
同样,假设我正在尝试编辑一列。如何在没有 f 字符串的情况下通过 .execute() 放入自己的变量?
即
new_date = '30/10/2022'
my_database.execute(f'UPDATE people SET birthday={new_date} WHERE name="Odin"')
更新数据的最佳方式是什么?
另外,如何判断数据库是否已损坏?
编辑:我应该补充我自己对“脆弱性”的理解。用户可以在 new_date 中输入自己的 SQL 命令,以便执行人员输入不同的命令。
答:
1赞
Michael M.
10/31/2022
#1
是的,只有当用户可以更改new_date
时,它才会让您容易受到攻击。例如,假设由用户设置为。然后,f-string 将解析为new_date
30/10/2022; DROP DATABASE users --
UPDATE people SET birthday=30/10/2022; DROP DATABASE users -- WHERE name="Odin"
如果将此查询发送到您的数据库,则它将删除名为 的数据库。users
若要使用户输入安全地发送到数据库,必须对其进行清理。要清理数据库输入,请参阅此网页。例如,代码是安全的:
my_database.execute('UPDATE people SET birthday=%s WHERE name="Odin"', (new_date,))
如果是恒定的并且用户不能以任何方式更改,则理论上是安全的。但是,始终要谨慎行事。就我个人而言,我选择对所有输入进行消毒,而不是冒险。new_date
评论
0赞
Tim Roberts
10/31/2022
请注意,您需要在后面使用逗号才能使其成为元组。new_date
0赞
Michael M.
10/31/2022
@TimRoberts 好电话,我已经更新了我的答案。
评论
new_date
my_database.execute('UPDATE people SET birthday=? WHERE name="Odin"', (new_date,))