Linee guida per scripting e codifica

Scripting

Per ulteriori informazioni, consulta la documentazione JSAPI della campagna.

Se esegui lo script utilizzando workflow, applicazioni web, jssp, segui queste best practice:

  • Provare a evitare di utilizzare le istruzioni SQL il più possibile.

  • Se necessario, utilizzare funzioni con parametri (istruzione di preparazione) invece della concatenazione di stringhe.

    Cattiva pratica:

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

    Buona pratica:

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

    sqlSelect non supporta questa funzione, pertanto devi utilizzare la funzione di query della 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()
    

Per evitare iniezioni SQL, è necessario aggiungere le funzioni SQL all'elenco consentiti da utilizzare in Adobe Campaign. Una volta aggiunti all’elenco consentiti, diventano visibili agli operatori nell’editor espressioni. Consulta questa pagina.

IMPORTANTE

Se utilizzi una build precedente a 8140, l'opzione XtkPassUnknownSQLFunctionsToRDBMS potrebbe essere impostata su '1'. Se desideri proteggere il database, elimina questa opzione (o impostala su "0").

Se utilizzi l’input dell’utente per creare filtri in query o istruzioni SQL, devi sempre eseguirne l’escape (consulta la documentazione JSAPI di Campaign - Protezione dei dati: funzioni di escape). Queste funzioni sono:

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

Protezione del nuovo modello dati

Base cartelle

Fai riferimento a queste pagine:

Diritti denominati

Oltre al modello di sicurezza basato su cartelle, puoi utilizzare diritti denominati per limitare le azioni dell’operatore:

  • È possibile aggiungere alcuni filtri di sistema (sysFilter) per impedire la lettura/scrittura nei dati (vedere questa pagina).

    <sysFilter name="writeAccess">    
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>  
    </sysFilter>
    
  • È inoltre possibile proteggere alcune azioni (metodo SOAP) definite negli schemi. È sufficiente impostare l'attributo di accesso con il diritto corrispondente denominato come valore.

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

    Per ulteriori informazioni, consulta questa pagina.

IMPORTANTE

È possibile utilizzare i diritti denominati nel nodo del comando in un navtree. Offre una migliore esperienza utente ma non fornisce alcuna protezione (usa solo il lato client per nasconderli/disattivarli). È necessario utilizzare l'attributo di accesso.

Tabella di overflow

Se è necessario proteggere i dati riservati (parte di uno schema) a seconda del livello di accesso dell’operatore, non nasconderli nella definizione del modulo (condizioni enabledIf/visibleIf).

L’entità completa viene caricata dalla schermata , ed è possibile visualizzarla anche nella definizione della colonna. A questo scopo, devi creare una tabella di overflow. Fai riferimento a questa pagina.

Aggiunta di sottotitoli nelle applicazioni web

È buona norma aggiungere un captcha nelle pagine di destinazione/nelle pagine di abbonamento pubbliche. Sfortunatamente, aggiungere un captcha nelle pagine DCE (Digital Content Editor) non è facile. Ti mostreremo come aggiungere un captcha v5 o un Google reCAPTCHA.

Il modo generale per aggiungere un captcha nel DCE consiste nel creare un blocco di personalizzazione per includerlo facilmente nel contenuto della pagina. Sarà necessario aggiungere un'attività Script e un Test.

Blocco di personalizzazione

  1. Vai a Resources > Campaign Management > Personalization blocks e creane uno nuovo.

  2. Utilizza il tipo di contenuto Web application e seleziona Visible in the customization menus.

    Per ulteriori informazioni, consulta questa pagina.

    Ecco un esempio di Captcha campagna:

    <%
    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>
    <%
    }
    %>
    
    • Le linee da 1 a 6 generano tutti gli input necessari.

    • Le linee 7 alla fine della maniglia errori.

    • La linea 4 consente di modificare le dimensioni della casella grigia del captcha (larghezza/altezza) e la lunghezza della parola generata (minWordSize/maxWordSize).

    • Prima di utilizzare Google reCAPTCHA, è necessario registrarsi su Google e creare un nuovo sito reCAPTCHA.

      <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
      Dovresti essere in grado di disabilitare il pulsante di convalida, ma poiché non disponiamo di un pulsante/collegamento standard, è meglio farlo nell’HTML stesso. Per informazioni su come farlo, fai riferimento a questa pagina.

Aggiornamento dell'applicazione web

  1. Accedi alle proprietà dell'applicazione web per aggiungere una variabile booleana denominata captchaValid.

  2. Tra l’ultima pagina e l’attività Storage , aggiungi un Script e un Test.

    Collega il ramo True al Storage e l’altro alla pagina che avrà il captcha.

  3. Modificare la condizione del ramo True con "[vars/captchaValid]" è uguale a True.

  4. Modifica l’attività Script . Il contenuto dipenderà dal motore captcha selezionato.

  5. Infine, puoi aggiungere il blocco personalizzato nella pagina: fare riferimento a questa pagina.

IMPORTANTE

Per l’integrazione reCAPTCHA, è necessario aggiungere JavaScript lato client nell’HTML (in <head>...</head>):

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

Captcha campagna

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

Linea 6: puoi inserire qualsiasi tipo di messaggio di errore.

Google ricontcha

Fare riferimento alla documentazione ufficiale.

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")
}

Per usare JSON.parse devi includere "shared/json2.js" nella tua webApp:

A partire dalla build 8797, per utilizzare l’URL dell’API di verifica, è necessario aggiungerlo all’elenco consentiti nel file serverConf aggiungendo nel nodo urlPermission :

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

In questa pagina