您之前可能已经看过它了,但我基本上都在尝试避免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'
知道什么是错的吗? 感谢
答案 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>