繁体   English   中英

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

[英]Salesforce REST API how to avoid leaking sensitive data in query parameter

我正在尝试使用 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. 参数化搜索 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进行全文搜索。 这可能会返回许多记录..但您以结构化的方式过滤搜索,以确保您只会看到SSN__c = '123456789' Contact记录。 只要您尝试检索的对象 + 字段存在于索引中,您将在此特定示例中通过参数化搜索看到的结果将与通过/query的 SOQL 查询的结果相同

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

顶点类:

@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;}
    }
}

POST 到/services/apexrest/findcontactbyssn

{
 "ssn": "12345678"
}

你应该看到这个回应:

{
 "id": "003..."
}

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

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

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

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

要了解有关查询字符串如何通过 https 安全的更多信息,请参阅此 stackoverflow 问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM