Linee guida per scripting e codifica scripting-coding-guidelines

Scripting

Per ulteriori dettagli, consulta la documentazione JSAPI per Campaign.

Se esegui uno script utilizzando workflow, applicazioni web e jssp, segui le best practice:

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

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

    Pratica non valida:

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

    Buone pratiche:

    code language-none
    sqlGetInt( "select iRecipientId from NmsRecipient where sEmail = $(sz) limit 1", request.getParameter('email'));
    
    note important
    IMPORTANT
    sqlSelect non supporta questa funzionalità, pertanto è necessario utilizzare la funzione query della classe DBEngine:
    code language-none
    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 SQL injection, è necessario aggiungere le funzioni SQL al inserisco nell'elenco Consentiti di da utilizzare in Adobe Campaign. Una volta aggiunte al inserisco nell'elenco Consentiti di, queste diventano visibili agli operatori nell’editor di espressioni. Consulta questa pagina.

IMPORTANT
Se si utilizza una build precedente alla 8140, l'opzione XtkPassUnknownSQLFunctionsToRDBMS potrebbe essere impostata su '1'. Se si desidera proteggere il database, eliminare questa opzione o impostarla su '0'.

Se si utilizza l'input dell'utente per generare filtri nelle query o nelle istruzioni SQL, è sempre necessario eseguirne l'escape (fare riferimento alla 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 cartella

Consulta queste pagine:

Diritti denominati

Oltre al modello di protezione basato su cartelle, è possibile utilizzare i diritti denominati per limitare le azioni dell'operatore:

  • Puoi aggiungere alcuni filtri di sistema (sysFilter) per impedire la lettura/scrittura nei tuoi dati (consulta questa pagina).

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

    code language-none
    <method name="grantVIPAccess" access="myNewRole">
        <parameters>
    ...
        </parameters>
    </method>
    

    Per ulteriori informazioni, consulta questa pagina.

IMPORTANT
È possibile utilizzare i diritti denominati nel nodo del comando in una struttura ad albero. Offre una migliore esperienza utente, ma non fornisce alcuna protezione (utilizza solo il lato client per nasconderli o disabilitarli). Devi utilizzare l’attributo di accesso.

Tabella di overflow

Se devi 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, e puoi anche visualizzarla nella definizione della colonna. A questo scopo, è necessario creare una tabella di overflow. Fai riferimento a questa pagina.

Aggiunta di captcha nelle applicazioni web

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

Il modo generale per aggiungere un captcha nel DCE consiste nel creare un blocco di personalizzazione per includerlo facilmente nel contenuto della pagina. Dovrai 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:

    code language-javascript
    <%
    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 righe 7 alla fine gestiscono gli errori.

    • La riga 4 consente di modificare le dimensioni della casella grigia 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 poter disabilitare il pulsante di convalida, ma poiché non disponiamo di pulsanti/collegamenti standard, è meglio farlo nel HTML stesso. Per informazioni su come eseguire questa operazione, fare 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, aggiungere Script e Test.

    Collegare il ramo True a 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 scelto.

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

IMPORTANT
Per l'integrazione reCAPTCHA, è necessario aggiungere JavaScript lato client nel HTML (in <head>...</head>):
<script src="https://www.google.com/recaptcha/api.js" async defer></script>

Campaign captcha

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

Riga 6: puoi inserire qualsiasi messaggio di errore.

Google recaptcha

Consulta la 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 utilizzare JSON.parse è necessario includere "shared/json2.js" nel WebApp:

A partire dalla build 8797, per utilizzare l’URL dell’API di verifica, è necessario aggiungerlo al inserisco nell'elenco Consentiti di nel file serverConf aggiungendo nel nodo urlPermission:

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

recommendation-more-help
601d79c3-e613-4db3-889a-ae959cd9e3e1