我试图使用REST进行查询,并遇到以下问题:
使用查询端点上的GET请求公开整个查询字符串,其中可能包含敏感数据,如SSN、电话号码等.
https://[instance-url].my.salesforce.com/services/data/v48.0/query/?q=SELECT Id FROM Contact WHERE SSN__c = '123456789'
如何安全地使用rest进行这样的查询?是否有一个等效的请求,我可以使用至少使用POST请求,而post主体是查询?因为那部分是通过https加密的。
谢谢你的帮助
发布于 2020-03-20 19:54:42
AFAIK,salesforce只提供一个GET方法来执行SOQL查询。人们可以在自己的组织中编写自己的REST端点,接受主体中的查询并执行它,但在我看来,这是浪费时间。
查询字符串参数是在https上保护的。这是一个常见的误解,人们认为整个url是在传递中以纯文本形式打开的。当向https url发出请求时,它首先向[instance-url].my.salesforce.com建立安全隧道,然后在安全隧道上传输url的其余部分和任何其他数据。
如果您担心某个处于中间攻击的人从您的查询字符串中嗅探到SSN,请不要。一个缺点是,如果您从浏览器而不是编程调用访问这个url,那么浏览器有机会存储/缓存历史记录或自动完成,那么它就不太好了。
但我怀疑您是否能够通过浏览器完成此操作,因为salesforce需要在授权头中设置一个承载令牌,而且在浏览器中键入url或单击链接时,没有一种简单的方法可以设置标头。
要了解查询字符串如何在https上安全,请参阅这个堆叠溢出问题。
发布于 2020-03-20 22:13:40
你有两个选择。
如果您将下面的正文发布到/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上对搜索索引中的所有对象和所有字段进行全文搜索。这可能会返回许多您正在以结构化方式过滤搜索的records..but,以保证您只会看到Contact记录中的SSN__c = '123456789'。只要要检索的对象+字段存在于索引中,则在这个特定示例中通过参数化搜索看到的结果将与通过/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;}
}
}发布到/services/apexrest/findcontactbyssn与
{
"ssn": "12345678"
}你应该看到这样的反应:
{
"id": "003..."
}https://stackoverflow.com/questions/60715522
复制相似问题