首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Salesforce REST如何避免查询参数中敏感数据的泄漏

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

Stack Overflow用户
提问于 2020-03-17 02:36:41
回答 2查看 1.6K关注 0票数 2

我试图使用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加密的。

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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上安全,请参阅这个堆叠溢出问题

票数 0
EN

Stack Overflow用户

发布于 2020-03-20 22:13:40

你有两个选择。

  1. 参数化搜索API。此选项可用,并以POST作为方法。API是Salesforce基于文本的搜索引擎的RESTful接口。通常,基于文本的搜索使用SOSL作为查询语言.参数化搜索API跳过SOSL,为您提供了一个更容易使用的选项。

如果您将下面的正文发布到/services/data/v48.0/parameterizedSearch

代码语言:javascript
运行
复制
{
   "q": "123456789",
   "sobjects": [
      {
         "name": "Contact",
         "where": "SSN__c = '123456789'"
      }
   ],
   "fields": ["id"]
}

假设搜索返回单个记录(ID被编辑),您应该看到类似这样的响应:

代码语言:javascript
运行
复制
{
  "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查询相同

  1. 自定义REST (又名心尖休息 / Apex服务)。对于像您这样的情况,这是一个典型的实现选项。您可以通过POST发送任何有效负载,然后任意处理它。

顶点级:

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
{
 "ssn": "12345678"
}

你应该看到这样的反应:

代码语言:javascript
运行
复制
{
 "id": "003..."
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60715522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档