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