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?
我可以使用现有的SOAP API会话验证Salesforce REST API吗?