[英]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 加密的。
谢谢你的帮助
你有两个选择。
如果您将以下正文发布到/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 查询的结果相同
顶点类:
@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.