python - 使用 pyodbc 最佳实践的动态 SQL 查询 WHERE 子句
问题描述
我正在尝试生成一个 SQL 查询,例如
SELECT FirstName,
LastName
FROM Names
WHERE (FirstName LIKE '%FNameA%' OR FirstName LIKE '%FNameB%' ....OR FirstName LIKE '%FNameN%')
AND (LastName LIKE '%LNameA%'OR LastName LIKE '%LNameB%'..... OR LastName LIKE '%LNameN%')
在 python 中动态并使用 pyodbc 在 Microsoft SQL 服务器上运行它。我只是想知道在这里避免 SQL 注入漏洞的最佳做法是什么。
例如,对于输入数量已知的查询,我可以使用绑定参数将任何输入转义到查询中
"SELECT * FROM mytable WHERE colx = ? AND coly = ?", (x, y).
有没有办法使用参数来构造具有任意数量的“Fnames”和“LNames”的第一个示例名称搜索查询?
解决方案
当您说应该使用绑定参数来防止 SQL 注入时,您是正确的。如果需要,您可以简单地在 for 循环中构建 SQL:
firstNameSql = []
for name in firstNames:
firstNameSql.append('FirstName like '%?%')
sql = "SELECT FirstName, LastName FROM Names WHERE (" + firstNameSql.join(' OR ') + ")"
不过,我建议您研究一个功能更全面的 ORM,它可以为您提供查询构建器。看看这个问题的想法。
推荐阅读
- c# - 使用端口重定向到 URL - IIS
- ios - 如何在不破坏响应者链的情况下将 UIViewController 的视图嵌入到另一个视图中
- cypress - 调用 Cypress 运行或打开时触发一次的全局事件挂钩
- math - 如果我们重复样本 n 次,其中 n 是正整数,集合的中位数会改变吗?
- scikit-learn - 是否可以在分层KFold 中取回列表?
- kubernetes - Java-client:检查操作删除操作完成的最佳方法?
- ruby-on-rails - ActiveRecord 通过多个表关联
- jhipster - JHipster 与额外字段的多对多关系
- c++ - 如何在 C++ 中打印此星形图案?
- javascript - 为什么我不能通过回调访问当前执行上下文?