v7

Diretrizes de script e codificação

Última atualização em 2023-08-15

Script

Para obter mais detalhes, consulte Documentação JSAPI do Campaign.

Se você criar scripts usando fluxo de trabalho, aplicações web, jssp, siga estas práticas recomendadas:

  • Tente evitar usar instruções SQL o máximo possível.

  • Se necessário, use funções parametrizadas (instrução prepare) em vez de concatenação de strings.

    Prática incorreta:

    sqlGetInt( "select iRecipientId from NmsRecipient where sEmail ='" + request.getParameter('email') +  "'  limit 1" )
    

    Prática recomendada:

    sqlGetInt( "select iRecipientId from NmsRecipient where sEmail = $(sz) limit 1", request.getParameter('email'));
    
    IMPORTANTE

    O sqlSelect não oferece suporte a esse recurso, portanto, é necessário usar a função de consulta da classe DBEngine:

    var cnx = application.getConnection()
    var stmt = cnx.query("SELECT sFirstName, sLastName FROM NmsRecipient where sEmail = $(sz)", request.getParameter('email'))
    for each(var row in stmt) logInfo(row[0] + " : " + row[1])
    cnx.dispose()
    

Para evitar injeções de SQL, as funções SQL devem ser adicionadas ao arquivo de inclui na lista de permissões a ser usado no Adobe Campaign. Depois de adicionadas ao incluo na lista de permissões µ, elas se tornam visíveis para os operadores no editor de expressão. Consulte esta página.

IMPORTANTE

Se você estiver usando uma build com mais de 8140, a variável XtkPassUnknownSQLFunctionsToRDBMS pode ser definida como '1'. Se quiser proteger seu banco de dados, exclua esta opção (ou defina-a como '0').

Se você estiver usando a entrada do usuário para construir filtros em queries ou instruções SQL, sempre será necessário escapá-los (consulte Documentação JSAPI do Campaign - Proteção de dados: funções de escape). Essas funções são:

  • NL.XML.escape(data)
  • NL.SQL.escape(data)
  • NL.JS.escape(data)
  • NL.XML.escapeAttribute(data)

Proteção de seu novo modelo de dados

Base da pasta

Consulte estas páginas:

Direitos nomeados

Além do modelo de segurança baseado em pastas, você pode usar direitos nomeados para limitar as ações do operador:

  • Você pode adicionar alguns filtros de sistema (sysFilter) para impedir a leitura/gravação de seus dados (consulte esta página).

    <sysFilter name="writeAccess">
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>
    </sysFilter>
    
  • Você também pode proteger algumas ações (método SOAP) definidas em esquemas. Basta definir o atributo de acesso com o direito nomeado correspondente como o valor.

    <method name="grantVIPAccess" access="myNewRole">
        <parameters>
    ...
        </parameters>
    </method>
    

    Para obter mais informações, consulte esta página.

IMPORTANTE

Você pode usar direitos nomeados no nó de comando em uma árvore de navegação. Proporciona uma melhor experiência ao usuário, mas não fornece nenhuma proteção (use apenas o lado do cliente para ocultá-los/desativá-los). É necessário usar o atributo de acesso.

Tabela de sobreposição

Se você precisar proteger dados confidenciais (parte de um esquema), dependendo do nível de acesso do operador, não os oculte na definição do formulário (condições enabledIf/visibleIf).

A entidade completa é carregada pela tela, mas você também pode exibi-las na definição da coluna. Para fazer isso, você precisa criar uma tabela de sobreposição. Consultar esta página.

Adicionar captchas em aplicações web

É uma boa prática adicionar um captcha em páginas de páginas/assinaturas públicas. Infelizmente, adicionar um captcha nas páginas do DCE (Digital Content Editor) não é fácil. Mostraremos como adicionar um captcha v5 ou um reCAPTCHA do Google.

A maneira geral de adicionar um captcha no DCE é criar um bloco de personalização para incluí-lo facilmente no conteúdo da página. Será necessário adicionar um Script atividade e um Teste.

Bloco de personalização

  1. Ir para Resources > Campaign Management > Personalization blocks e criar um novo.

  2. Use o Web application tipo de conteúdo e verificação Visible in the customization menus.

    Para obter mais informações, consulte esta página.

    Veja um exemplo de um captcha do Campaign:

    <%
    var captchaID = CaptchaIDGen();
    %>
    <img src="/nms/jsp/captcha.jsp?captchaID=<%=captchaID%>&width=200&height=50&minWordSize=8&maxWordSize=8"/>
    <input id="captchaValue" name="captchaValue" <%= String(ctx.vars.captchaValid) === "false" ? class="ui-state-error" : "" %>>
    <input type="hidden" name="captchaID" value="<%=captchaID%>"/>
    <%
    if( serverForm.isInputErroneous("captchaValue") ) {
    %>
    <script type="text/javascript">
    $("#captchaValue").addClass("ui-state-error")
    </script>
    <%
    }
    %>
    
    • As linhas de 1 a 6 geram todas as entradas necessárias.

    • As linhas 7 e sucessivas tratam dos erros.

    • A Linha 4 permite alterar o tamanho da caixa cinza do captcha (largura/altura) e o comprimento da palavra gerada (minWordSize/maxWordSize).

    • Antes de usar o Google reCAPTCHA, você deve se registrar no Google e criar um novo site reCAPTCHA.

      <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>

    Você deve ser capaz de desativar o botão de validação, mas como não temos nenhum botão/link padrão, é melhor fazê-lo no próprio HTML. Para aprender a fazê-lo, consulte esta página.

Atualização da sua aplicação web

  1. Acesse as propriedades da sua aplicação web para adicionar uma variável booleana chamada captchaValid.

  2. Entre a última página e a variável Storage atividade, adicionar um Script e uma Test.

    Conectar a ramificação True para o Storage e o outro na página que terá o captcha.

  3. Edite a condição da ramificação True com "[vars/captchaValid]" é igual a True.

  4. Editar a atividade Script. O conteúdo dependerá do mecanismo captcha escolhido.

  5. Finalmente, você pode adicionar seu bloco personalizado à página: consulte esta página.

IMPORTANTE

Para a integração do reCAPTCHA, é necessário adicionar JavaScript do lado do cliente no HTML (em <head>...</head>):

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

Captcha da campanha

var captchaID = request.getParameter("captchaID");
var captchaValue = request.getParameter("captchaValue");

if( !CaptchaValidate(captchaID, captchaValue) ) {
  serverForm.logInputError("captchaValue",
                           "The characters you typed for the captcha must match the image ones.",
                           "captchaValue")
  ctx.vars.captchaValid = false
}
else
  ctx.vars.captchaValid = true

Linha 6: você pode colocar qualquer tipo de mensagem de erro.

recaptcha do Google

Consulte a documentação oficial.

ctx.vars.captchaValid = false
var gReCaptchaResponse = request.getParameter("g-recaptcha-response");

// Call reCaptcha API to validate it
var req = new HttpClientRequest("https://www.google.com/recaptcha/api/siteverify")
req.method = "POST"
req.header["Content-Type"] = "application/x-www-form-urlencoded"
req.body = "secret=YOUR_SECRET_HERE&response=" + encodeURIComponent(gReCaptchaResponse)
req.execute()
var response = req.response
if( response.code == 200 ) {
  captchaRes = JSON.parse(response.body.toString(response.codePage));
  ctx.vars.captchaValid = captchaRes.success
}

if( ctx.vars.captchaValid == false ) {
  serverForm.logInputError("reCaptcha",
                           "Please validate the captcha",
                           "reCaptcha")
  logInfo("reCaptcha not validated")
}

Para usar o JSON.parse, você precisa incluir "shared/json2.js" em seu webApp:

Incluir na lista de permissões A partir da build 8797, para usar o URL da API de verificação, você deve adicioná-lo ao arquivo no serverConf adicionando no nó urlPermission:

<url dnsSuffix="www.google.com" urlRegEx="https://www.google.com/recaptcha/api/siteverify"/>

Nesta página