Linee guida per scripting e codifica scripting-coding-guidelines
Scripting
Per ulteriori informazioni, consulta 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.
Se utilizzi l’input dell’utente per generare filtri nelle query o nelle istruzioni SQL, devi sempre eseguirne l’escape (consulta Documentazione JSAPI per Campaign - Protezione dei dati: escape functions). 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:
-
È possibile aggiungere alcuni filtri di sistema (sysFilter) per impedire la lettura/scrittura dei dati (vedere 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.
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 una Script attività e un Test.
Blocco di personalizzazione
-
Vai a Resources > Campaign Management > Personalization blocks e creane uno nuovo.
-
Utilizza il Web application tipo di contenuto e controllo Visible in the customization menus.
Per ulteriori informazioni, consulta questa pagina.
Ecco un esempio di Campaign captcha:
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, consulta questa pagina.
-
Aggiornamento dell’applicazione web
-
Accedi alle proprietà dell’applicazione web per aggiungere una variabile booleana denominata captchaValid.
-
Tra l'ultima pagina e Storage attività, aggiungi un Script e un Test.
Collega il ramo True al Storage e l’altro alla pagina che avrà il captcha.
-
Modifica la condizione del ramo True con
"[vars/captchaValid]"
è uguale a True. -
Modifica il Script attività. Il contenuto dipenderà dal motore captcha scelto.
-
Infine, puoi aggiungere il blocco personalizzato nella pagina: fai riferimento a questa pagina.
<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 sezione 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"/>