当前位置: 代码迷 >> python >> SQL 查询中的 Python 变量
  详细解决方案

SQL 查询中的 Python 变量

热度:15   发布时间:2023-07-16 10:52:56.0

我正在创建一个与 SQL 数据库接口的 Python Flask 应用程序。 它所做的一件事是获取用户输入并将其存储在数据库中。 我目前的做法看起来像这样

mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}")

这不是这样做的好方法或正确方法。 某些字符(例如 ')不仅会导致错误,还会使我容易受到 SQL 注入的影响。 有人可以告诉我这样做的好方法吗?

所以,如果你想避免 sql 注入......你必须有一个安全的查询,即你不希望你的查询做一些它不应该做的事情

  queryRun = "SELECT * FROM privileges_groups WHERE id = %s" % (PrivID)

当您使用“%s”这个变量作为占位符时,您可以避免对注入可以或不可以对整个系统造成什么的歧义。

然后..运行.execute()调用:

  mycursor.execute(queryRun)

注意:这也可以在一个步骤中完成.execute()调用中的所有更改,但您最好拆分为分段方法。

这不是100%,但应该有很大帮助。

为了防止注入攻击,您应该使用占位符作为值。

所以改变

mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}")

mycursor.execute("SELECT * FROM privileges_groups WHERE id = ?", (PrivID,))

占位符只能存储给定类型的值,而不是任意的 SQL 片段。 这将有助于防止奇怪的(可能是无效的)参数值。

但是,您不能对表名和列名使用占位符。

注意:仅单元素元组需要尾随逗号,但多元素元组不需要。 逗号从括号包围的表达式中消除元组的歧义。

相关: