【问题标题】:Django custom SQL Query not working with paramsDjango 自定义 SQL 查询不使用参数
【发布时间】:2015-04-23 21:48:00
【问题描述】:

我正在使用 SQLite

这是我的查询。我想检索三列并按其中一列名称排序。

query = "SELECT user_name, %s, %s FROM highscores_skills ORDER BY %s DESC"
cursor.execute(query, [skill, skill_exp, skill_exp])

我从 GET 请求中得到 skill,而 skill_exp 基本上是 '_exp' 附加到技能。

很遗憾,这不起作用。 结果我得到了列名。 像这样, 约翰,攻击,attack_exp Doe,攻击,attack_exp

其中attack 是skill 的值,attack_exp 是skill_exp 的值

如果我不使用参数,它可以工作,但很容易发生 SQL 注入。

我不确定出了什么问题。我也尝试过使用 ? 而不是 %s 作为占位符,就像它在 Python SQLite 中一样,但没有。

【问题讨论】:

  • 您不能将占位符用作列名(仅用作比较值),因此从用户输入中获取它可能不是一个好主意...这就是说您始终可以进行正常的 python 字符串格式化...此外,为什么你不是只使用 django ORM 吗?
  • @JoranBeasley 啊,真可惜。我并没有完全将其作为用户输入。我正在使用查询字符串来传递信息。我猜我会在 urls.py 中检索值。谢谢。
  • @JoranBeasley 我可以使用 python 字符串格式化但 SQL 注入。而且我不想使用 django ORM,因为我希望结果在列表中,而不是在模型中。
  • 所以将模型转换为元组列表...开销几乎为零...而且这样做更好...

标签: python django sqlite django-models


【解决方案1】:

您不能在 sql 引擎中为列名使用占位符

一个。

query = "SELECT user_name, %s, %s FROM highscores_skills ORDER BY %s DESC"%(skill, skill_exp, skill_exp)
cursor.execute(query)

由于 sqlinjection 导致不安全

B.

 allowed_query_verbs = ["attack","defend","armor","magic"]
 queries = dict(
    "SELECT user_name, {0}, {0}_exp FROM highscores_skills ORDER BY {0}_exp DESC".format(v) for v in allowed_query_verbs
 )
 cursor.execute(queries[skill])

更安全,因为只允许预定义的查询

【讨论】:

  • 谢谢,但我现在从 url 而不是查询字符串中获取价值。这似乎足够安全。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2021-01-22
  • 1970-01-01
  • 2017-04-01
  • 2012-12-20
相关资源
最近更新 更多