脚本和编码准则 scripting-coding-guidelines
脚本
有关详细信息,请参阅Campaign JSAPI文档。
如果您使用工作流、Web应用程序和jssp编写脚本,请遵循以下最佳实践:
-
尽量避免使用SQL语句。
-
如果需要,请使用参数化(prepare语句)函数而不是字符串连接。
不当做法:
code language-none sqlGetInt( "select iRecipientId from NmsRecipient where sEmail ='" + request.getParameter('email') + "' limit 1" )
良好做法:
code language-none sqlGetInt( "select iRecipientId from NmsRecipient where sEmail = $(sz) limit 1", request.getParameter('email'));
note important IMPORTANT sqlSelect不支持此功能,因此您必须使用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()
列入允许列表要避免SQL注入,必须将SQL函数添加到要在Adobe Campaign中使用的。 将它们添加到允许列表后,您的操作员可在表达式编辑器中看到它们。 请参见此页面。
如果您使用用户输入在查询或SQL语句中构建过滤器,则始终必须转义它们(请参阅Campaign JSAPI文档 — 数据保护:转义函数)。 这些函数包括:
- NL.XML.escape(data)
- NL.SQL.escape(data)
- NL.JS.escape(data)
- NL.XML.escapeAttribute(data)
保护您的新数据模型
文件夹库
请参阅以下页面:
已命名权限
除了基于文件夹的安全模型之外,您还可以使用已命名权限来限制操作员操作:
-
您可以添加一些系统筛选器(sysFilter)以防止读取/写入您的数据(请参阅此页面)。
code language-none <sysFilter name="writeAccess"> <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/> </sysFilter>
-
您还可以保护架构中定义的某些操作(SOAP方法)。 只需将具有相应命名权限的access属性设置为值即可。
code language-none <method name="grantVIPAccess" access="myNewRole"> <parameters> ... </parameters> </method>
有关详细信息,请参见此页面。
溢出表
如果您需要根据操作员的访问级别保护机密数据(模式的一部分),请勿在表单定义(enabledIf/visibleIf条件)中隐藏这些数据。
整个实体由屏幕加载,您还可以在列定义中显示它们。 为此,必须创建一个溢出表。 请参阅此页面。
在Web应用程序中添加captcha
好的做法是在公共登陆页面/订阅页面中添加验证码。 不幸的是,在DCE(数字内容编辑器)页面中添加验证码并不容易。 我们将向您说明如何添加v5验证码或Google reCAPTCHA。
在DCE中添加验证码的常规方法是创建个性化块,以轻松地将其包含在页面内容中。 您必须添加 脚本 活动和 测试。
个性化块
-
转到 Resources > Campaign Management > Personalization blocks 并创建一个新帐户。
-
使用 Web application 内容类型并检查 Visible in the customization menus。
有关详细信息,请参见此页面。
以下是 营销活动验证码 的示例:
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> <% } %>
-
第1行至第6行生成所有需要的输入。
-
第7行到结束句柄错误。
-
第4行允许您更改验证码灰框大小(宽度/高度)和生成的单词的长度(minWordSize/maxWordSize)。
-
在使用Google reCAPTCHA之前,您必须在Google上注册并创建一个新的reCAPTCHA站点。
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
您应该能够禁用“验证”按钮,但由于我们没有任何标准按钮/链接,因此最好在HTML中禁用该按钮/链接。 要了解如何执行此操作,请参阅此页面。
-
更新Web应用程序
-
访问Web应用程序的属性以添加名为 captchaValid 的布尔变量。
-
在最后一页和 Storage 活动之间,添加 Script 和 Test。
将分支 True 插入 Storage,将另一个分支插入具有验证码的页面。
-
编辑分支True的条件,其中
"[vars/captchaValid]"
等于True。 -
编辑 Script 活动。 内容将取决于所选的验证码引擎。
-
最后,您可以在页面中添加个性化块:请参阅此页面。
<head>...</head>
中):<script src="https://www.google.com/recaptcha/api.js" async defer></script>
营销活动验证码
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
第6行:您可以输入任何类型的错误消息。
Google recaptcha
请参阅官方文档。
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")
}
要使用JSON.parse,您必须在webApp中包含“shared/json2.js”:
列入允许列表自内部版本8797开始,要使用验证API URL,您必须通过在urlPermission节点中添加它来将其添加到serverConf文件中的:
<url dnsSuffix="www.google.com" urlRegEx="https://www.google.com/recaptcha/api/siteverify"/>