如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?

Posted

技术标签:

【中文标题】如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?【英文标题】:How do I safely escape user input for bigquery node insert? Possible to use parameterized query on bigquery.insert node library? 【发布时间】:2018-05-18 22:02:28 【问题描述】:

我需要将用户表单中的数据插入到 bigquery 中,我想知道清理/转义/清理数据的最佳方法是什么。我正在使用Google Cloud BigQuery library。

可以在这个库的插入上使用Parameterized Queries 吗?我不确定如何,也许我需要使用 sql insert 而不是使用节点库 insert(jsObject)?现在我在放入 JS 对象之前对每个字符串使用 mysql 转义库,但我不确定这是否安全?

下面是插入的样子:

bigquery
.dataset("analytics")
.table("actions")
.insert(someJSObjectWithUserInputData)
.then(() => 
    console.log(`Inserted row`);
)

【问题讨论】:

【参考方案1】:

通过加载作业或流式 API 运行插入时,您无需转义数据以确保安全。在问题中table.insert 正在流式传输数据,因此无需担心为了安全而转义。

如果您选择 INSERT INTO 使用新的支持 DML 语句,那么您将不得不担心转义。在这种情况下,您可以使用提到的参数化查询。您可以使用@param_name 之类的标识符和? 的位置参数。

https://cloud.google.com/bigquery/docs/parameterized-queries

在这种情况下,对于 Node.JS,您需要使用以下 API 参考,特别是 params

params:对于位置 SQL 参数,提供一个值数组。对于命名的 SQL 参数,提供一个将每个命名参数映射到其值的对象。

https://cloud.google.com/nodejs/docs/reference/bigquery/1.2.x/BigQuery#query

【讨论】:

谢谢。我认为 table.insert 会干净且安全,但我在任何地方都找不到它。我假设我想在 SELECTing 退出任何用户输入数据时使用参数化查询? table.insert 是完全安全的 - 因为那里没有可能的 SQL 注入

以上是关于如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用节点 js 客户端在 BigQuery 中存储数字类型以进行流式插入?

如何同步调用 google-bigquery 删除和插入 API?

BigQuery:如何取消转义额外转义/序列化的 JSON 字符串

Bigquery 客户端插入安全性

如何防止 PHP PDO 通过 jQuery AJAX 插入 MySQL varchar 中的转义字符

使用用户定义的函数在 BigQuery 数据集中插入海量数据时如何优化性能