Salesforce REST API 如何避免在查询参数中泄露敏感数据

Posted

技术标签:

【中文标题】Salesforce REST API 如何避免在查询参数中泄露敏感数据【英文标题】:Salesforce REST API how to avoid leaking sensitive data in query parameter 【发布时间】:2020-06-28 03:06:10 【问题描述】:

我正在尝试使用 REST API 进行查询,但遇到了以下问题:

在查询端点上使用 GET 请求会暴露整个查询字符串,其中可能包含敏感数据,例如 SSN、电话号码等...

https://[instance-url].my.salesforce.com/services/data/v48.0/query/?q=SELECT Id FROM Contact WHERE SSN__c = '123456789'

如何安全地使用 rest api 进行这样的查询? 是否有一个等效的请求,我至少可以使用 POST 请求,而 post body 是查询?因为那部分是通过 https 加密的。

感谢您的帮助

【问题讨论】:

【参考方案1】:

你有两个选择。

    Parameterized Search API。此选项开箱即用,使用 POST 作为方法。 API 是 Salesforce 的基于文本的搜索引擎的 RESTful 接口。通常,基于文本的搜索使用 SOSL 作为查询语言。参数化搜索 API 会跳过 SOSL,并为您提供更轻松的使用选项。

如果您将以下正文发布到/services/data/v48.0/parameterizedSearch


   "q": "123456789",
   "sobjects": [
      
         "name": "Contact",
         "where": "SSN__c = '123456789'"
      
   ],
   "fields": ["id"]

您应该看到类似这样的响应,假设搜索返回单个记录(ID 已编辑):


  "searchRecords" : [ 
    "attributes" : 
      "type" : "Contact",
      "url" : "/services/data/v48.0/sobjects/Contact/003..."
    ,
    "Id" : "003..."
   ]

JSON 负载中 q 键的值必须与 where 键/子句中的值相同。您正在对搜索索引中的所有对象和所有字段对123456789 进行全文搜索。这可能会返回许多记录..但是您正在以结构化的方式过滤搜索,以保证您只会看到Contact 的记录,其中SSN__c = '123456789'。只要您尝试检索的对象 + 字段存在于索引中,您将在此特定示例中通过参数化搜索看到的结果将与通过 /query 的 SOQL 查询的结果相同

    自定义 REST API(又名 Apex REST / Apex 网络服务)。对于像您这样的情况,这是一个典型的实施选项。您可以通过 POST 发送任何有效负载,然后根据需要进行处理。

Apex 类:

@RestResource(urlMapping='/findcontactbyssn')
global class ContactResource 
    @HttpPost
    global static void findContactBySSN() 
        SearchRequest input = (SearchRequest)JSON.deserialize(RestContext.request.requestBody.toString(),SearchRequest.class);
        Contact c = [SELECT Id FROM Contact WHERE SSN__c = :input.ssn];
        SearchResponse output = new SearchResponse();
        output.id = c.id;
        RestContext.response.responseBody = Blob.valueOf(JSON.serialize(output));
        RestContext.response.statusCode = 200;  
    

    class SearchRequest 
      public String ssn get;set;
    

    class SearchResponse 
      public String id get;set;
    

发布到/services/apexrest/findcontactbyssn


 "ssn": "12345678"

您应该会看到以下响应:


 "id": "003..."

【讨论】:

感谢您的回答。参数化搜索看起来很有趣。它看起来确实很慢,也许它会搜索所有内容?【参考方案2】:

AFAIK,salesforce 只提供了一个 GET 方法来执行 SOQL 查询。可以在他们的组织中编写自己的 REST 端点,接受正文中的查询并执行它,但在我看来这是浪费时间。

查询字符串参数受https 保护。这是一个常见的误解,人们认为整个 url 在传输中以纯文本形式打开。当向https url 发出请求时,它首先建立到[instance-url].my.salesforce.com 的安全隧道,然后通过安全隧道传输剩余的url 和任何其他数据。

如果您担心中间攻击的某个人会从您的查询字符串中嗅出 SSN,请不要这样做。一个缺点是,如果您从浏览器而不是编程调用访问此 url,那么浏览器有机会存储/缓存历史记录或自动完成,那么它不会那么好。

但我怀疑您是否能够通过浏览器执行此操作,因为 salesforce 需要在 Authorization 标头中设置不记名令牌,并且我知道在浏览器中键入 url 或单击时没有简单的方法来设置标头链接。

要了解更多关于查询字符串如何通过 https 安全的信息,请参阅this *** question

【讨论】:

非常感谢!事实上,我有一个误解,即查询参数没有加密。然而,安全问题来自不同的方面,例如这些数据最终出现在日志中,或者根据您提供的 *** 问题的任何其他服务器端问题。

以上是关于Salesforce REST API 如何避免在查询参数中泄露敏感数据的主要内容,如果未能解决你的问题,请参考以下文章

在salesforce 营销云中,如何进行REST api 调用?如何建立网址?

Salesforce:任何可用于访问 Salesforce 日历的 Rest API?

在Salesforce中通过REST API编辑自定义对象

我可以使用现有的SOAP API会话验证Salesforce REST API吗?

Salesforce OAuth 与 REST API 使用 Javascript

Salesforce REST API 和 DELETE 方法