如何安全地为 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
之类的标识符和?
的位置参数。
在这种情况下,对于 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 字符串