Utilizar la colaboración heredada para proteger su código de Apex

Ahora, puede especificar la palabra clave inherited sharing en las clases de Apex, lo que permite a la clase ejecutarse en el modo de colaboración al que llamó la clase. Utilizar inherited sharing le permite pasar la revisión de seguridad y asegurarse de que su código de Apex confidencial no se utilice de formas inesperadas o inseguras. Una clase de Apex con inherited sharing se ejecuta como with sharing al utilizarse como un controlador de páginas de Visualforce, un servicio REST de Apex o un punto de entrada para una transacción de Apex.

Dónde: Este cambio se aplica a Lightning Experience y Salesforce Classic en Enterprise Edition, Performance Edition, Unlimited Edition y Developer Edition.

Por qué: De forma predeterminada, Apex es inseguro sin una declaración de colaboración. Diseñar clases de Apex que puedan ejecutarse en modo with sharing o without sharing en tiempo de ejecución es una técnica avanzada y que puede ser difícil de distinguir frente a otra técnica en la que se omitió por error una declaración específica de colaboración. Una declaración inherited sharing explícita hace que la intención sea clara, lo que evita la ambigüedad que surge de una declaración omitida o los falsos positivos de las herramientas de análisis de seguridad.

Existe una clara diferencia entre una clase de Apex marcada con inherited sharing y una con una declaración de colaboración omitida. Si la clase se utilizó como punto de entrada para una transacción de Apex, se ejecuta una declaración de colaboración omitida como without sharing. Sin embargo, inherited sharing garantiza que el valor predeterminado sea la ejecución como with sharing. Una clase declarada como inherited sharing solo se ejecuta como without sharing cuando se llama explícitamente desde un contexto without sharing que ya está establecido.

Cómo: Este ejemplo declara una clase de Apex con inherited sharing y una invocación de Visualforce de ese código de Apex. A causa de la declaración inherited sharing, solo se mostrarán los contactos para los que el usuario de ejecución tenga acceso de colaboración. Si se omite la declaración, se mostrarán incluso los contactos para los que el usuario no tenga derechos de visualización a causa del comportamiento predeterminado inseguro de omitir la declaración.
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>