Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中的Python变量_Python_Sql - Fatal编程技术网

SQL查询中的Python变量

SQL查询中的Python变量,python,sql,Python,Sql,我正在创建一个与SQL数据库接口的Python Flask应用程序。它所做的一件事是接受用户输入并将其存储在数据库中。我目前的做法是这样的 mycursor.execute(f"SELECT * FROM privileges_groups WHERE id = {PrivID}") 这样做既不好也不正确。不仅某些字符(如“会导致错误),还使我容易受到SQL注入的影响。有人能告诉我一个好方法吗?所以,如果你想避免sql注入…你必须有一个安全的查询,也就是说,你不想让你的查询做它不应该做的事情

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

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,))