通过API查询salesforce时,避免SOQL注入的最佳方法是什么?我感兴趣的两个主要API是SOAP和REST。我目前的方法是从不使用来自用户的任何输入(如果他们正在搜索公司名称,这是不切实际的)或对字符串中的某些字符进行编码。
然而,我看到APEX中有参数化,所以我想知道是否有类似的方式通过API来完成。
发布于 2013-05-03 23:14:55
我认为您真正需要做的就是确保正确转义输入,在本例中是公司名称。我不知道有一种参数化的方法来为这两个API构建查询对象。
但是,如果需要的话,您可以从Salesforce中公开一个自定义的web服务方法,以便您可以将该值传入。然后,在Salesforce Apex代码语言中,您可以使用类似于以下语法的语法来参数化该值:
public Account[] queryCompany(string companyName) {
return [SELECT Id FROM Account WHERE Name = :companyName];
}发布于 2013-05-04 03:21:29
哲学论调
你真正想要的是什么:)
如果您的应用程序应该以从不同来源(Salesforce UI、PHP连接器、一些移动应用程序)访问的相同方式工作,那么将Apex视为一些将被重用的存储过程可能是最有意义的。这意味着您将向它们传递安全参数。
如果你打算手工查询&不太依赖Apex -也许你需要的是像database.com或其他基于云的DB解决方案?
实际答案
我不知道通过API分别传递查询命令和参数(如绑定变量/准备好的语句)的开箱即用的方法。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),因此转义应该是安全的……
https://stackoverflow.com/questions/16356233
复制相似问题