SQL查询中的Python变量

2024-10-02 04:33:12 发布

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

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

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

这样做既不好也不正确。不仅某些字符(如“会导致错误),还使我容易受到SQL注入的影响。有谁能告诉我一个好办法吗


Tags: 用户fromid数据库应用程序flaskexecutesql
2条回答

因此,如果您想避免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片段。这将有助于防止出现奇怪的(可能是无效的)参数值

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

注意:只有一个元素元组需要尾随逗号,但多个元素元组不需要尾随逗号。逗号可以消除元组与被括号包围的表达式之间的歧义

相关:How do parameterized queries help against SQL injection?

相关问题 更多 >

    热门问题