Richtlinien für Skripterstellung und Kodierung

Scripts

Weiterführende Informationen finden Sie in der JSAPI-Dokumentation für Campaign.

Wenn Sie Scripts mit Workflows, Webanwendungen und JSSP verwenden, folgen Sie diesen Best Practices:

  • Vermeiden Sie möglichst SQL-Anweisungen.

  • Verwenden Sie bei Bedarf parametrierte Funktionen (prepare-Anweisung) anstelle von String-Konkatenation.

    Schlechte Praxis:

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

    Gute Praxis:

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

    sqlSelect unterstützt diese Funktion nicht. Daher müssen Sie die Abfrage-Funktion der DBEngine-Klasse verwenden:

    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()
    

Um SQL-Injections zu vermeiden, müssen SQL-Funktionen auf die Zulassungsliste gesetzt werden, damit sie in Adobe Campaign verwendet werden können. Sobald sie auf der Zulassungsliste stehen, werden sie für Ihre Benutzer im Ausdruckseditor sichtbar. Mehr dazu erfahren Sie auf dieser Seite.

WICHTIG

Wenn Sie einen Build verwenden, der älter als 8140 ist, kann die Option XtkPassUnknownSQLFunctionsToRDBMS auf '1' eingestellt werden. Wenn Sie Ihre Datenbank sichern möchten, löschen Sie diese Option (oder setzen Sie sie auf '0').

Wenn Sie Benutzereingaben zur Erstellung von Filtern in Abfragen oder SQL-Anweisungen verwenden, müssen Sie sie immer escapen (siehe die JSAPI-Dokumentation für Campaign - Schutz von Daten: Escape-Funktionen). Diese Funktionen sind:

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

Schutz Ihres neuen Datenmodells

Ordnerbasis

Siehe folgende Seiten:

Spezifische Berechtigungen

Zusätzlich zum ordnerbasierten Sicherheitsmodell können Sie Benutzeraktionen auch mit spezifischen Berechtigungen einschränken:

  • Sie können einige Filter (sysFilter) hinzufügen, um zu verhindern, dass Daten gelesen/geschrieben werden (siehe diese Seite).

    <sysFilter name="writeAccess">    
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>  
    </sysFilter>
    
  • Sie können auch einige Aktionen (SOAP-Methode) schützen, die in Schemas definiert sind. Legen Sie einfach das Attribut access mit dem entsprechenden Namen right als Wert fest.

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

    Weitere Informationen hierzu finden Sie auf dieser Seite.

WICHTIG

Sie können Spezifische Berechtigungen im Befehlsknoten in einem navtree verwenden. Es bietet eine bessere Benutzererfahrung, bietet aber keinen Schutz (nur clientseitig verwenden, um sie auszublenden/zu deaktivieren). Sie müssen das Attribut access verwenden.

Überlauftabelle

Wenn Sie vertrauliche Daten (Teil eines Schemas) je nach Zugriffsebene des Operators schützen müssen, sollten Sie sie nicht in der Formulardefinition ausblenden (enabledIf/visibleIf-Bedingungen).

Die vollständige Entität wird vom Bildschirm geladen, Sie können sie auch in der Spaltendefinition anzeigen. Dazu müssen Sie eine Überlauftabelle erstellen. Lesen Sie diese Seite.

Hinzufügen von Captchas in Webanwendungen

Es ist empfehlenswert, öffentlichen Landingpages und Anmeldeseiten ein Captcha hinzuzufügen. Leider ist dies in DCE-Seiten (Digital Content Editor) nicht einfach. Wir zeigen Ihnen, wie Sie ein v5 Captcha oder ein Google reCAPTCHA hinzufügen.

Im Allgemeinen wird ein Captcha im DCE hinzugefügt, indem ein Gestaltungsbaustein erstellt wird, mit dem es in den Seiteninhalt integriert werden kann. Sie müssen außerdem eine Script-Aktivität und einen Test hinzufügen.

Gestaltungsbaustein

  1. Gehen Sie zu Ressourcen > Kampagnenverwaltung > Gestaltungsbausteine und erstellen Sie einen neuen Gestaltungsbaustein.

  2. Verwenden Sie den Content-Typ Webanwendung und aktivieren Sie Sichtbar in den Anpassungsmenüs.

    Weitere Informationen dazu finden Sie auf dieser Seite.

    Dies ist ein Beispiel für ein Kampagnen-Captcha:

    <%
    var captchaID = CaptchaIDGen();
    %>
    <img src="/nms/jsp/captcha.jsp?captchaID=%3C%25%3DcaptchaID%25%3E&width=200&height=50&minWordSize=8&maxWordSize=8&lang=de"/>
    <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>
    <%
    }
    %>
    
    • Mit den Zeilen 1 bis 6 werden alle erforderlichen Eingaben erzeugt.

    • Mit den Zeilen 7 bis zum Ende werden Fehler gehandhabt.

    • Mit Zeile 4 können Sie die Größe des grauen Captcha-Feldes (Breite/Höhe) sowie die Länge des erzeugten Worts ändern (minWordSize/maxWordSize).

    • Bevor Sie Google reCAPTCHA verwenden, müssen Sie sich bei Google registrieren und eine neue reCAPTCHA-Site erstellen.

      <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
      Sie sollten die Überprüfungsschaltfläche deaktivieren können. Da jedoch keine Standardschaltfläche/-verknüpfung vorhanden ist, ist es besser, dies im HTML-Code selbst zu tun. Weitere Informationen dazu finden Sie auf dieser Seite.

Webanwendung aktualisieren

  1. Greifen Sie auf die Eigenschaften Ihrer Webanwendung zu, um eine boolesche Variable mit dem Namen captchaValid hinzuzufügen.

  2. Fügen Sie zwischen der letzten Seite und der Datenspeicherung-Aktivität ein Script und einen Test hinzu.

    Schließen Sie die Verzweigung True an die Datenspeicherung und die andere an die Seite an, die die captcha enthält.

  3. Bearbeiten Sie die Bedingung der Verzweigung True mit "[vars/captchaValid]" gleich True.

  4. Bearbeiten Sie die Aktivität Script. Der Inhalt hängt von der gewählten Captcha-Engine ab.

  5. Schließlich können Sie Ihren personalisierten Block auf der Seite hinzufügen: verweisen Sie auf diese Seite.

WICHTIG

Für die reCAPTCHA-Integration müssen Sie clientseitiges JavaScript im HTML hinzufügen (in <head>...</head>):

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

Kampagne 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

Zeile 6: Sie können eine beliebige Fehlermeldung eingeben.

Google rekaptcha

Bitte lesen Sie die offizielle Dokumentation.

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

Um JSON.parse zu verwenden, müssen Sie "shared/json2.js" in Ihre Webapp integrieren:

Seit Build 8797 müssen Sie zur Verwendung der Verifizierungs-API-URL diese auf die Zulassungsliste in der serverConf-Datei setzen, indem Sie sie im Knoten urlPermission hinzufügen:

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

Auf dieser Seite