TypeError:在字符串格式化字符串python期间不是所有参数都被转换

时间:2015-03-26 03:28:19

标签: python mysql

您之前可能已经看过它了,但我基本上都在尝试避免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])

这会引发错误说:

<type 'exceptions.TypeError'>: not all arguments converted during string formatting 
  args = ('not all arguments converted during string formatting',) 
  message = 'not all arguments converted during string formatting'

知道什么是错的吗? 感谢

1 个答案:

答案 0 :(得分:2)

您没有指定您正在使用的确切库,但假设它符合 Python DB API ,您可能希望将execute行更改为:

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

根据OP的评论进行编辑:

在防止 SQL注入方面,使用%s是当前的标准。我不确定你所链接的答案中的帖子是什么...要记住的一些事情是线程已被关闭为“不具有建设性”,而答案也是〜7年旧的,所以很可能当时存在问题,那个答案可能已经引用不再适用了。

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

请注意,非常具体地 '%s',然后在foo % bar调用中使用execute,但使用不带引号的%s并传递参数作为execute的第二个参数。

例如,我使用 psycopg2 ,它完全符合 DB API ,其current doc描述了使用%s来防止注入。< / p>