【问题标题】:PyMySQL Parametrized Query and Date FormatPyMySQL 参数化查询和日期格式
【发布时间】:2013-06-25 09:08:56
【问题描述】:

我正在尝试使用 PyMySQL 运行以下查询

cur.execute("SELECT %s as label, UNIX_TIMESTAMP(CONVERT(DATE_FORMAT(date_added, '%%Y-%%m-%%d-%%H:%%i:00'),DATETIME)) as time, %s  as metric FROM %s WHERE id >= %d GROUP BY label, time", (label, metric, table, min_id,))

我收到以下错误:

TypeError: %d format: a number is required, not str

label、metric、table 和 min_id 分别是 string、string、string 和 int。

我没有正确地转义 % 吗?不太清楚,尝试了一些方法。

谢谢!

【问题讨论】:

    标签: python mysql escaping pymysql


    【解决方案1】:

    ... id >= %d ... 应该是... id >= %s ...

    所有参数在应用于格式字符串之前都被转义为字符串。

    【讨论】:

    • 但是.... 但是.... 为什么?试试select * from users limit %d; 作为您的查询!
    • 不,那行不通,只有当你使用cur.execute('select * from users limit %d' % (10,)),它使用字符串格式而不是sql参数并且有潜在危险
    • 请原谅我的无知,但是将整数插入 SQL 查询有什么危险?这不像10; drop table users; 是一个整数。
    • 我并不是说使用整数是危险的,而是通常使用字符串格式来构造 sql 查询是危险的。在这种情况下,这不是问题,但想象一下您稍后需要添加一些带有字符串参数的 where 子句,并忽略了您使用字符串格式而不是 sql 参数化。突然你有一个潜在的 sql 注入漏洞......
    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多