【发布时间】: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