TypeError:字符串格式化过程中并非所有参数都转换为python

2024-03-29 09:25:39 发布

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

您可能以前见过,但我基本上是为了避免MySQL注入,所以我使用Python将查询格式化如下:

if "username" in form:
    username = form["username"].value
else:
    success = 0
    error = "User Name is Missing"

cur.execute("SELECT COUNT(*) FROM users WHERE screenName=':1'",[username])
results = int(cur.fetchall()[0][0])

这会抛出一个错误:

^{pr2}$

你知道怎么回事吗? 谢谢


Tags: nameinformexecuteifisvaluemysql
1条回答
网友
1楼 · 发布于 2024-03-29 09:25:39

您没有指定您正在使用的库,但是假设它符合Python-DB-API,您可能需要将execute行改为:

cur.execute("SELECT COUNT(*) FROM users WHERE screenName=%s",[username])

根据OP的评论进行编辑:

使用%s是防止SQL注入的当前标准。我不知道你链接的答案里的帖子是什么意思。。。需要记住的是,这个问题的答案是“不具有建设性”,而且这个答案也已经有7年的历史了,所以很有可能当时的问题是,这个答案可能已经不再适用了。在

但是%s意味着库(在execute方法中)处理所有转义和引用,是防止注入的方法。(与使用常规插值相反,比如说,通过format,这将使其暴露于注入中。)

注意,这是非常具体的不是'%s',然后在execute调用中使用foo % bar,而是一个未加引号的%s,并将参数作为第二个参数传递给execute。在

例如,我使用psycopg2,它完全兼容dbapi,它的current doc描述了使用%s来防止注入。在

相关问题 更多 >