【问题标题】:How to safely inject parameter into string DB query java?如何安全地将参数注入字符串 DB 查询 java?
【发布时间】:2017-03-14 21:29:54
【问题描述】:

我有这个 bigQuery 示例代码:

List<TableRow> rows =
                executeQuery(
                        "SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words Where country = 'USA' " +
                                + "FROM [publicdata:samples.shakespeare]",
                        bigquery,
                        PROJECT_ID);

如果我想安全地将国家注入该字符串

我该怎么做?

我想避免sql注入的风险,这是有风险的:

public void foo(String countryParam) {
    List<TableRow> rows =
                    executeQuery(
                            "SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words Where country = '"+countryParam+"' " +
                                    + "FROM [publicdata:samples.shakespeare]",
                            bigquery,
                            PROJECT_ID);
}

更新

找不到 Elliott Brossard 建议的明确示例:

public List<String> getVenuesForBrand(BrandChangeDataUi brandChangeDataUi) throws IOException {
    QueryParameter param = new QueryParameter();
    param.setName("country");
    param.setParameterValue(new QueryParameterValue().setValue("USA"));
    param.setParameterType(new QueryParameterType().setType("string"));

    List<QueryParameter> params =  new ArrayList<>();
    params.add(param);

    JobConfigurationQuery jobConfigurationQuery = new JobConfigurationQuery();
    jobConfigurationQuery.setQueryParameters(params);

    jobConfigurationQuery.setQuery( "SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words Where country = 'USA' " +
                                    + "FROM [publicdata:samples.shakespeare]");



    List<TableRow> rows =
            executeQuery(
                    jobConfigurationQuery.toString(),
                    bigquery,
                    PROJECT_ID);

    printResults(rows);

    return null;
}

【问题讨论】:

  • 在您的示例中,您需要调用 jobConfigurationQuery.setUseLegacySql(false); 来启用标准 SQL。要测试查询参数在查询中是否可用,请尝试执行 jobConfigurationQuery.setQuery("SELECT @country AS country;");

标签: java database google-bigquery sql-injection


【解决方案1】:

看看jobs.query reference下的queryParameters。对于 Java API,它们被记录为 JobConfigurationQuery 的一部分。请注意,查询参数只能使用standard SQL

【讨论】:

  • 我找不到一个明确的例子。你能看看我的尝试并建议如何解决它吗?
  • SELECT ... where country = @country FROM [publicdata:samples.shakespeare]
  • 那行不通。对于标准 SQL,它需要是 SELECT APPROX_TOP_COUNT(corpus, 10) AS title WHERE country = @country FROM publicdata.samples.shakespeare;
  • 你是对的 - 忘记修复表引用 - 我的重点是引用参数
  • 但是我想用bigQuery语法,那我怎么用standard SQL呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多