SQL查询中的Python变量
我正在创建一个与SQL数据库接口的Python Flask应用程序。它所做的一件事是接受用户输入并将其存储在数据库中。我目前的做法是这样的SQL查询中的Python变量,python,sql,Python,Sql,我正在创建一个与SQL数据库接口的Python Flask应用程序。它所做的一件事是接受用户输入并将其存储在数据库中。我目前的做法是这样的 mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}") 这样做既不好也不正确。不仅某些字符(如“会导致错误),还使我容易受到SQL注入的影响。有人能告诉我一个好方法吗?所以,如果你想避免sql注入…你必须有一个安全的查询,也就是说,你不想让你的查询做它不应该做的事情
mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}")
这样做既不好也不正确。不仅某些字符(如“会导致错误),还使我容易受到SQL注入的影响。有人能告诉我一个好方法吗?所以,如果你想避免sql注入…你必须有一个安全的查询,也就是说,你不想让你的查询做它不应该做的事情 当您使用“%s”这个变量作为占位符时,您可以避免关于注入可以或不能对整个系统造成什么的歧义 然后..运行
.execute()
调用:
mycursor.execute(queryRun)
注意:这也可以一步完成,在.execute()
调用中进行所有更改,但最好将其拆分为分段方法
这不是100%,但应该会有很大帮助。为了防止注入攻击,您应该为值使用占位符 所以改变
mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}")
到
占位符只能存储给定类型的值,不能存储任意SQL片段。这将有助于防止出现奇怪的(可能是无效的)参数值
但是,不能对表名和列名使用占位符
注意:只有一个元素元组需要尾随逗号,但多个元素元组不需要尾随逗号。逗号可以消除元组与被括号包围的表达式之间的歧义
相关:当前方式有什么问题?只要传入的
id
是安全的,您就应该是好的。另一种方法可能是在.execute()
调用之外创建查询,然后在设置查询后调用查询。它处理用户文本输入。如果有人在输入中输入“username”,整个查询很可能会中断。如果将其应用到我的代码中,我会得到如下内容mycursor.execute(“SELECT username,FROM username,WHERE username\u safe=?”,(username.lower())
。这似乎不起作用,因为它正在尝试查找?。有什么帮助吗?@Realitikdash我在上面加了一条注释。您需要一个尾随逗号来清楚地表明您提供的是一个元组。因此,您的查询应该是:mycursor.execute(“从username\u safe=?”的用户中选择用户名),(username.lower(),)
。您不需要在用户名
后加逗号。非常感谢,我忘记了元组需要尾随逗号。我认为这解决不了问题。我的问题是我使用的是直接用户文本输入。那么输入是什么呢?
mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}")
mycursor.execute("SELECT * FROM privileges_groups WHERE id = ?", (PrivID,))