Directrices de script y código scripting-coding-guidelines

Scripts

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

Si ejecuta un script mediante un flujo de trabajo, aplicaciones web o jsp, siga estas prácticas recomendadas:

  • Intente evitar el uso de instrucciones SQL tanto como pueda.

  • Si es necesario, utilice funciones parametrizadas (instrucción prepare) en lugar de concatenaciones de cadenas.

    Práctica incorrecta:

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

    Buenas prácticas:

    code language-none
    sqlGetInt( "select iRecipientId from NmsRecipient where sEmail = $(sz) limit 1", request.getParameter('email'));
    
    note important
    IMPORTANT
    sqlSelect no admite esta característica, por lo que debe utilizar la función de consulta de la clase 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()
    

Para evitar inyecciones SQL, las funciones SQL deben agregarse a la lista de permitidos para utilizarse en Adobe Campaign. Una vez añadidos a la lista de permitidos, los operadores del editor de expresiones los verán. Consulte esta página.

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

Si utiliza entradas del usuario para generar filtros en consultas o instrucciones SQL, siempre debe escaparlos (consulte Documentación de Campaign JSAPI - 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 de los operadores:

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

    code language-none
    <sysFilter name="writeAccess">
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>
    </sysFilter>
    
  • SOAP También puede proteger algunas acciones (método de) definidas en esquemas. Solo tiene que establecer el atributo de acceso con el correspondiente derecho de nombre como valor.

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

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

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

Tabla de desbordamiento

Si necesita proteger datos confidenciales (parte de un esquema) según el 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 las páginas de aterrizaje o páginas 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 de personalización para incluirlo fácilmente en el contenido de la página. Deberá agregar una actividad Script y una Prueba.

Bloque de personalización

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

  2. Use el tipo de contenido Web application y marque Visible in the customization menus.

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

    Este es un ejemplo de captcha de campaña:

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

    • Las líneas 7 hasta el final manejan 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>

    Debería poder deshabilitar 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 su aplicación web para agregar una variable booleana llamada captchaValid.

  2. Entre la última página y la actividad Storage, agregue Script y Test.

    Conecte la rama True a Storage y la otra a la página que tendrá el captcha.

  3. Edite la condición de la rama Verdadero con "[vars/captchaValid]" igual a Verdadero.

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

  5. Finalmente, puede agregar su bloque personalizado en la página: consulte esta página.

IMPORTANT
Para integrar 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 la aplicación web:

A partir de 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"/>

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