Directrices de script y código

Secuencia de comandos

Para obtener más información, consulte Documentación de JSAPI de Campaign.

Si crea secuencias de comandos con flujos de trabajo, aplicaciones web, jssp, siga estas prácticas recomendadas:

  • Intente evitar usar instrucciones SQL tanto como pueda.

  • Si lo necesita, utilice funciones parametrizadas (instrucción de preparación) en lugar de concatenaciones de cadenas.

    Práctica incorrecta:

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

    Práctica recomendada:

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

    sqlSelect no admite esta función, por lo que debe utilizar la función de consulta de la clase 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 inyecciones SQL, las funciones SQL deben agregarse a la lista de permitidos que se utilizará en Adobe Campaign. Una vez añadidas a la lista de permitidos, pasan a ser visibles para los operadores del editor de expresiones. Consulte esta página.

IMPORTANTE

Si utiliza una compilación anterior a 8140, la variable XtkPassUnknownSQLFunctionsToRDBMS se puede establecer en "1". Si desea proteger la base de datos, elimine esta opción (o establézcala en '0').

Si utiliza la entrada del usuario para crear filtros en consultas o instrucciones SQL, siempre tiene que escaparlas (consulte Documentación de JSAPI de Campaign - Protección de datos: funciones de escape). Estas funciones son:

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

Protección del nuevo modelo de datos

Base de carpetas

Consulte estas páginas:

Derechos asignados

Además del modelo de seguridad basado en carpetas, puede utilizar derechos asignados para limitar las acciones del operador:

  • Puede agregar algunos filtros del sistema (sysFilter) para evitar que se lean o escriban en los datos (consulte esta página).

    <sysFilter name="writeAccess">    
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>  
    </sysFilter>
    
  • También puede proteger algunas acciones (método SOAP) definidas en esquemas. Establezca el atributo de acceso con el derecho asignado correspondiente como valor.

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

    Para obtener más información, consulte esta página.

IMPORTANTE

Puede utilizar derechos asignados en el nodo de comando de un árbol de navegación. Proporciona una mejor experiencia de usuario, pero no proporciona ninguna protección (utilice solo el lado del cliente para ocultarlos o deshabilitarlos). Debe utilizar el atributo access .

Tabla de desbordamiento

Si necesita proteger datos confidenciales (parte de un esquema) en función del nivel de acceso del operador, no los oculte en la definición del formulario (condiciones enabledIf/visibleIf).

La pantalla carga la entidad completa y también puede mostrarla en la definición de la columna. Para ello, debe crear una tabla de desbordamiento. Consulte esta página.

Adición de captchas en aplicaciones web

Se recomienda añadir un captcha en páginas de aterrizaje o de suscripción públicas. Desafortunadamente, añadir un captcha en las páginas del DCE (editor de contenido digital) no es fácil. Le mostraremos cómo añadir un captcha v5 o un reCAPTCHA de Google.

La forma general de añadir un captcha en el DCE es crear un bloque personalizado para incluirlo fácilmente dentro del contenido de la página. Tendrá que agregar una Secuencia de comandos actividad y Prueba.

Bloque personalizado

  1. Vaya a Resources > Campaign Management > Personalization blocks y cree uno nuevo.

  2. Utilice la variable Web application tipo de contenido y comprobar Visible in the customization menus.

    Para obtener más información, consulte esta página.

    Este es un ejemplo de Captcha de campaña:

    <%
    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>
    <%
    }
    %>
    
    • Las líneas 1 a 6 generan todas las entradas necesarias.

    • Las líneas 7 al final gestionan los errores.

    • La línea 4 permite cambiar el tamaño del cuadro gris captcha (ancho/alto) y la longitud de la palabra generada (minWordSize/maxWordSize).

    • Antes de usar Google reCAPTCHA, debe registrarse en Google y crear un nuevo sitio reCAPTCHA.

      <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
      Debe poder desactivar el botón de validación, pero como no tenemos ningún botón o vínculo estándar, es mejor hacerlo en el propio HTML. Para aprender a hacerlo, consulte esta página.

Actualización de la aplicación web

  1. Acceda a las propiedades de la aplicación web para añadir una variable booleana denominada captchaValid.

  2. Entre la última página y la Storage actividad, añada un Script y Test.

    Conectar la rama True a Storage y el otro a la página que tendrá el captcha.

  3. Editar la condición de la rama True con "[vars/captchaValid]" es igual a True.

  4. Edite la actividad Script. El contenido dependerá del motor captcha seleccionado.

  5. Finalmente, puede añadir el bloque personalizado en la página: consulte esta página.

IMPORTANTE

Para la integración de reCAPTCHA, debe agregar JavaScript del lado del cliente en el HTML (en <head>...</head>):

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

Captcha de campaña

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

Línea 6: puede poner cualquier tipo de mensaje de error.

Google recaptcha

Consulte la documentación 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 utilizar JSON.parse, debe incluir "shared/json2.js" en su aplicación web:

Desde la versión 8797, para utilizar la URL de la API de verificación, debe añadirla a la lista de permitidos en el archivo serverConf añadiendo el nodo urlPermission :

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

En esta página