繁体   English   中英

SQL 查询中的 Python 变量

[英]Python variables in SQL query

我正在创建一个与 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 片段。 这将有助于防止奇怪的(可能是无效的)参数值。

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

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

相关: 参数化查询如何帮助抵御 SQL 注入?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM