【问题标题】:Using LIKE '%a%' in PostgreSQL while sanitizing data agains SQL injections在 PostgreSQL 中使用 LIKE '%a%' 同时针对 SQL 注入清理数据
【发布时间】:2020-09-09 05:18:57
【问题描述】:

您好,我正在尝试使用 SQLAlchemy 在烧瓶上运行 postgresql 查询,但我不明白如何在使用 LIKE '%' 参数时保持查询的清理。

db.execute("SELECT * FROM books WHERE isbn LIKE '%:isbn%' OR title LIKE '%:title%L' OR author = '%:author%'", {"isbn": isbn, "title": title, "author": author})

这就是我得到的,但它当然不会运行。而且我不想牺牲系统的完整性来允许使用 LIKE。

有人对我有什么建议吗?

【问题讨论】:

  • 您使用的映射器不应该通过清理传递的变量来解决这个问题吗?
  • 映射器是什么意思?
  • 那个 db.execute 函数。它不是来自某个库并将传递的变量注入到查询中吗?也许这对你有帮助:stackoverflow.com/questions/1279613/…
  • 不,它没有。
  • 您是否担心用户在您不想要的地方注入通配符,或者担心它们完全从字符串中转义并运行完全不同的命令?

标签: postgresql flask-sqlalchemy sql-injection


【解决方案1】:

参数占位符不能位于 SQL 表达式中带引号的字符串内。否则将无法在 SQL 中使用看起来像占位符的字符作为文字字符串。

因此,您必须将占位符放在带引号的字符串之外,并使用 || string concatenation operator 与通配符连接。

db.execute("""SELECT * FROM books 
  WHERE isbn LIKE '%'||:isbn||'%' 
  OR title LIKE '%'||:title||'%L' 
  OR author LIKE '%'||:author||'%'""", 
  {"isbn": isbn, "title": title, "author": author})

另一种方法是将参数的值与 Python 中的% SQL 通配符连接起来,然后将结果字符串作为参数传递。在这种情况下,您可以跳过将通配符放入查询中。还是不要将参数占位符放在 SQL 表达式中的字符串引号内。

db.execute("""SELECT * FROM books 
  WHERE isbn LIKE :isbn 
  OR title LIKE :title
  OR author LIKE :author""", 
  {"isbn": "%"+isbn+"%", "title": "%"+title+"%L", "author": "%"+author+"%"})

P.S.:我将您的 author = 编辑为 author LIKE,因为您不能在 = 中使用通配符。

另外,我认为您在标题通配符之后还有一个额外的L。但我不知道这是不是故意的,所以我把它留在了我的例子中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2019-06-06
    • 2018-06-30
    • 2012-03-22
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多