Use compartilhamento herdado para proteger seu Apex Code

Agora você pode especificar a palavra-chave inherited sharing em uma classe do Apex, que permite à classe entrar no modo de compartilhamento da classe que a chamou. Usar inherited sharing permite que você passe na análise de segurança e garanta que seu Apex code privilegiado não seja usado de maneiras inesperadas ou não seguras. Uma classe do Apex com inherited sharing é executada como with sharing quando usada como um controlador de página do Visualforce, serviço REST do Apex ou um ponto de entrada para uma transação Apex.

Onde: Essa alteração se aplica ao Lightning Experience e ao Salesforce Classic nas edições Enterprise, Performance, Unlimited e Developer.

Por quê: Apex sem uma declaração de compartilhamento é inseguro por padrão. Projetar classes do Apex que são executadas no modo with sharing ou without sharing no tempo de execução é uma técnica avançada, e pode ser difícil distinguir de uma em que uma declaração de compartilhamento específica seja omitida por engano. Uma declaração de inherited sharing explícita torna a intenção clara, evitando a ambiguidade decorrente de uma declaração omitida ou falsos positivos do conjunto de ferramentas de análise de segurança.

Há uma clara diferença entre uma classe do Apex marcada com inherited sharing e outra com uma declaração de compartilhamento omitida. Se a classe for usada como o ponto de entrada para uma transação Apex, uma declaração de compartilhamento omitida é executada como without sharing. Porém, inherited sharing garante que o padrão seja a execução como with sharing. Uma classe declarada como inherited sharing é executada apenas como without sharing quando explicitamente chamada de um contexto without sharing já estabelecido.

Como: Este exemplo declara uma classe do Apex com inherited sharing e uma invocação do Visualforce desse Apex code. Devido à declaração inherited sharing, somente contatos para os quais o usuário em execução tenha acesso de compartilhamento são exibidos. Se a declaração for omitida, até mesmo os contatos que o usuário não tem direito de ver são exibidos devido ao comportamento padrão inseguro de omitir a declaração.
public inherited sharing class InheritedSharingClass{
    public List<Contact> getAllTheSecrets(){
        return [SELECT Name FROM Contact];
    }
}
<apex:page controller="InheritedSharingClass">
    <apex:repeat value="{!allTheSecrets}" var="record">
        {!record.Name}
    </apex:repeat>
</apex:page>