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



我试图使用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,为您提供了一个更容易使用的选项

如果将以下正文POST到/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发送任何有效负载,然后按照自己的意愿进行处理

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

使用将POST发送到/services/apexrest/findcontactbyssn

{
"ssn": "12345678"
}

你应该看到这样的回应:

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

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

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

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

但我怀疑你是否能够通过浏览器做到这一点,因为salesforce需要在Authorization标头中设置一个承载令牌,而且据我所知,在浏览器中键入url或单击链接时,没有简单的方法可以设置标头。

要了解更多关于查询字符串如何在https上安全的信息,请参阅这个stackoverflow问题

最新更新