【问题标题】:How to prevent query injection on Google Big Query如何防止 Google Big Query 上的查询注入
【发布时间】:2014-01-15 08:04:15
【问题描述】:

我正在向我们的网站编写一些 Google Big-query 动态报告实用程序,这将允许用户选择要在查询中替换的参数。给定这个查询“模板”:

SELECT  name ,
        birthday
FROM    [dataset.users]
WHERE   registration_date = '{{registration_date}}'

我们从用户那里获取 {{registration_date}} 值并在模板中替换它,从而产生一个查询:

SELECT  name ,
        birthday
FROM    [dataset.users]
WHERE   registration_date = '2013-11-11'

鉴于我正在使用 Google Big-query 客户端 API 执行查询,在这种情况下如何防止 sql-injection 之类的攻击, 并且 API 不允许像传统的 RDBMS api 那样使用定位参数。

【问题讨论】:

  • 验证用户输入以便您在查询中使用它。
  • @Dan - 说起来容易做起来难。防止 SQL 注入就像密码学一样——最好留给专业人士。甚至他们也经常弄错(参见addslashes,然后是mysql_escape_string,然后是mysql_real_escape_string
  • 谢谢@DanBracuk,但是,我自己做可怜的人验证是有潜在危险的。您对 Java 中的良好验证 API/工具/提示有任何指示吗?
  • 您必须做两件事。一是确保您拥有预期的数据类型。日期应该是日期,数字应该是数字,等等。接下来您要做的就是转义特殊字符,例如撇号。当您深入了解它时,即使您确实使用查询参数,数据类型的事情也应该发生。如果您在应用程序代码中使用 java,我建议在您的问题中添加 java 标记。
  • 感谢@DanBracuk 的评论,我已经添加了java 标签。

标签: java sql google-bigquery


【解决方案1】:

自从在 BigQuery 中推出标准 SQL 以来,可以使用 query parameters 作为防止 SQL 注入的一种方式。在您的查询中,您可以使用 @ 后跟名称来指定命名参数,例如

SELECT x, y FROM T WHERE x <= @x_max AND y = @target_y;

然后您可以通过 API 的query_parameters 属性提供参数值。

【讨论】:

    【解决方案2】:

    在 OWASP 中选中“防御选项 3:转义所有用户提供的输入”:

    https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_3:_Escaping_All_User_Supplied_Input

    更新:参数化查询现在是一个选项

    【讨论】:

    • 感谢 Fh 的回答。您提供的链接包含 MySQL 和 Oracle 的编码。对于 BigQuery,使用 MySQL ANSI 模式对输入进行编码是否足够?
    • 2 年后这仍然是首选解决方案吗?
    • 在下面查看我的答案。
    • 如果我从字段名称数组构建查询,所以我想从 {table_name} 中填写部分 SELECT {fields} 怎么办?只需使用一些严格的正则表达式/白名单检查字段名称?
    猜你喜欢
    • 2021-04-16
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2020-09-16
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多