通过 API 查询 salesforce 时避免 SOQL 注入的最佳方法是什么?我感兴趣的两个主要 API 是 SOAP 和 REST API。我目前的方法是永远不要使用用户的任何输入(如果他们正在搜索公司名称,这是不切实际的)或在字符串中编码某些字符。
但是我看到 APEX 中有参数化,所以我想知道是否有类似的方法可以通过 API 进行。
通过 API 查询 salesforce 时避免 SOQL 注入的最佳方法是什么?我感兴趣的两个主要 API 是 SOAP 和 REST API。我目前的方法是永远不要使用用户的任何输入(如果他们正在搜索公司名称,这是不切实际的)或在字符串中编码某些字符。
但是我看到 APEX 中有参数化,所以我想知道是否有类似的方法可以通过 API 进行。
哲学咆哮
你到底在追求什么:)
如果您的应用程序应该以从不同来源(Salesforce UI、PHP 连接器、某些移动应用程序)访问的相同方式工作,那么将 Apex 视为一些将被重用的存储过程可能是最有意义的。这意味着您将向它们传递安全参数。
如果您打算手工查询而不是太依赖 Apex - 也许您需要的是 database.com 或其他基于云的数据库解决方案?
实际答案
我不知道通过 API 分别传递查询命令和参数(如绑定变量/准备语句)的开箱即用方式。REST 和 SOAP API 都为您Database.query()
提供 Apex 中的基本内容。当然,有一些差异,如retrieve()
命令或queryMore()
但这是基线。
您可以做的是使用类似于 John 提出的方法(额外性能的奖励点 - 它们是预编译的)公开一些常用的搜索,或者构建一些通用的搜索?
List<sObject> runQuery(String query, List<List<String>> params){...}
如果runQuery
将包含绑定变量,params[0]
那么它应该可以工作。看起来很疯狂,但我没有测试它;)我会说绑定变量是最好的方法。另一种方法是逃避用户的输入,但 SQL 和 XSS 注入可以变得非常有创意。检查我可以用来测试我的页面输入的 XSS 示例?首先(是的,我知道您只询问了 SOQL)。
至于实际的 SOQL 注入:http ://wiki.developerforce.com/page/Secure_Coding_SQL_Injection 。由于“可能发生的最坏情况”是用户将搜索超出预期的内容(无法将 SELECT 转换为 INSERT)转义应该是安全的......
我认为您真正需要做的就是确保输入(在这种情况下为公司名称)正确转义。我不知道为任何一个 API 构建查询对象的参数化方式。
但是,如果您需要,您可以在 Salesforce 中公开自定义 Web 服务方法,以便您可以传入值。然后在 Salesforce Apex 代码语言中,您可以使用类似于以下的语法参数化该值:
public Account[] queryCompany(string companyName) {
return [SELECT Id FROM Account WHERE Name = :companyName];
}