【问题标题】:Dynamic SQL query WHERE clause using pyodbc best practice使用 pyodbc 最佳实践的动态 SQL 查询 WHERE 子句
【发布时间】:2019-11-15 00:49:14
【问题描述】:

我正在尝试生成类似的 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”的第一个示例名称搜索查询?

【问题讨论】:

  • 您必须动态创建具有所需参数数量的查询字符串。
  • 参数不会被替换在带引号的字符串中。必须是LIKE '%' + %s + '%'

标签: python sql pyodbc


【解决方案1】:

你可以这样做

if($x){ $value[] = $x}

if($y{ $value[] = $y} 

$sql = "SELECT * FROM mytable WHERE colx = ? AND coly = ?";     

$stmt ->pdo->prepare($sql);  

$stmt->execute($value);

【讨论】:

    【解决方案2】:

    您说的应该使用绑定参数来防止 SQL 注入是正确的。如果需要,您可以简单地在 for 循环中构建 SQL:

    firstNameSql = []
    for name in firstNames:
        firstNameSql.append('FirstName like '%?%')
    
    sql = "SELECT FirstName, LastName FROM Names WHERE (" + firstNameSql.join(' OR ') + ")"
    

    不过,我建议您研究一个功能更全面的 ORM,它可以为您提供查询构建器。看看this question 的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多