使用 F 字符串请求数据会导致 SQL 注入吗?[复制]

Will using F-strings to request data cause SQL injections? [duplicate]

提问人:Titan31 Hunter29 提问时间:10/31/2022 最后编辑:Titan31 Hunter29 更新时间:10/31/2022 访问量:1309

问:

我不熟悉注入攻击的工作原理。如果我只请求数据(而不是更新/插入),在 .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 命令,以便执行人员输入不同的命令。

python 数据库 sqlite sql注入

评论

2赞 Tim Roberts 10/31/2022
当然,这个例子不会,但如果来自用户输入,那么它当然可以。考虑用户是否输入“1;删除表 people;“作为新日期。您必须让数据库连接器执行此操作:。new_datemy_database.execute('UPDATE people SET birthday=? WHERE name="Odin"', (new_date,))
0赞 deceze 10/31/2022
伟大的逃避现实(或:在文本中使用文本需要知道什么)
0赞 bn_ln 10/31/2022
您可以在日期周围进行某种验证。例如,如果您知道它应该在某种范围内(即今年)
0赞 Titan31 Hunter29 10/31/2022
@TimRoberts 谢谢。我猜代码使连接器不将new_date视为命令?因此,即使我输入 SQL 命令,它也只会插入“1;把人当成我的生日,不执行呢?
0赞 tdelaney 10/31/2022
强制性 XKCD Little Bobby Tables 参考。

答:

1赞 Michael M. 10/31/2022 #1

是的,只有当用户可以更改new_date,它才会让您容易受到攻击。例如,假设由用户设置为。然后,f-string 将解析为new_date30/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 好电话,我已经更新了我的答案。