指令碼和編碼准則

指令碼

如需詳細資訊,請參閱促銷活動JSAPI檔案

如果您使用工作流程、Web應用程式、工作階段編寫指令碼,請遵循下列最佳實務:

  • 盡量避免使用SQL陳述式。

  • 如果需要,請使用參數化(prepare語句)函式,而不是字串串連。

    壞做法:

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

    良好做法:

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

    sqlSelect不支援此功能,因此您必須使用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()
    

為避免插入SQL,必須將SQL函式添加到允許清單中,以便在Adobe Campaign使用。 將它們新增至允許清單後,運算式編輯器中的運算子就會看到它們。 請參見此頁面

重要

如果您使用的內部版本早於8140,XtkPassUnknownSQLFunctionsToRDBMS​選項可能會設為'1'。 如果要保護資料庫,請刪除此選項(或將其設定為'0')。

如果您使用使用者輸入來建立查詢或SQL陳述式中的篩選器,則必須一律加以逸出(請參閱Campaign JSAPI檔案 —— 資料保護:逸出函式)。 這些函式包括:

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

保護新資料模型的安全

資料夾庫

請參閱以下頁面:

命名權限

除了資料夾型安全性模型外,您也可以使用命名權限來限制運算元動作:

  • 您可以添加一些系統篩選器(sysFilter)來防止對資料的讀/寫(請參見本頁)。

    <sysFilter name="writeAccess">    
        <condition enabledIf="hasNamedRight('myNewRole')=false" expr="FALSE"/>  
    </sysFilter>
    
  • 您也可以保護在結構描述中定義的某些操作(SOAP方法)。 只需將具有相應命名權限的訪問屬性設定為值即可。

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

    有關詳細資訊,請參見此頁面

重要

您可以在navtree的命令節點中使用命名權限。 它提供更佳的使用者體驗,但不提供任何保護(僅使用用戶端來隱藏/停用它們)。 您必須使用access屬性。

溢位表

如果您需要根據運算子存取層級來保護機密資料(架構的一部分),請勿在表單定義(enabledIf/visibleIf條件)中隱藏機密資料。

全圖元由畫面載入,您也可以在欄定義中顯示。 為此,必須建立溢出表。 請參閱本頁

在Web應用程式中新增擷取功能

在公開的登陸頁面/訂閱頁面中新增驗證碼是個很好的做法。 很遺憾,在DCE(數字內容編輯器)頁面中添加驗證碼並不容易。 我們將示範如何新增v5 captcha或Google reCAPTCHA。

在DCE中添加驗證碼的一般方法是建立個性化塊,以便輕鬆將其包含在頁面內容中。 您必須新增​Script​活動和​Test

個人化區塊

  1. 前往​Resources > Campaign Management > Personalization blocks​並建立新的。

  2. 使用​Web application​內容類型並檢查​Visible in the customization menus

    如需詳細資訊,請參閱本頁面

    以下是​促銷活動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=zh-Hant"/>
    <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應用程式

  1. 存取Web應用程式的屬性,以新增名為​captchaValid​的布林變數。

  2. 在最後一頁和​Storage​活動之間,添加​Script​和​Test

    將分支​True​插入​Storage,將另一個分支插入具有captcha的頁面。

  3. 編輯分支True的條件,"[vars/captchaValid]"等於True。

  4. 編輯​Script​活動。 內容將視所選的captcha引擎而定。

  5. 最後,您可以在頁面中新增個人化區塊:請參閱本頁

重要

若要進行reCAPTCHA整合,您必須在HTML(在<head>...</head>中)中新增用戶端JavaScript:

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

促銷活動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

第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檔案中的allow清單:

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

本頁內容