スクリプトとコーディングのガイドライン 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 インジェクションを避けるには、Adobe Campaignで使用するSQL関数を許可リストに追加する必要があります。 これらを式エディターに追加すると、式許可リストで演算子に表示されます。 このページを参照してください。

IMPORTANT
8140より古いビルドを使用している場合、XtkPassUnknownSQLFunctionsToRDBMS オプションが「1」に設定されている可能性があります。 データベースを保護する場合は、このオプションを削除します(または「0」に設定します)。

ユーザー入力を使用してクエリまたは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>
    

    詳しくは、このページを参照してください。

IMPORTANT
名前付き権限は、navtreeのコマンド ノードで使用できます。 これにより、ユーザーエクスペリエンスは向上しますが、保護は提供されません(クライアントサイドのみを使用して非表示/無効にします)。 アクセス属性を使用する必要があります。

オーバーフローテーブル

オペレーターのアクセスレベルに応じて機密データ(スキーマの一部)を保護する必要がある場合、フォーム定義で非表示にしないでください(enabledIf/visibleIf 条件)。

完全なエンティティは画面によって読み込まれます。列の定義で表示することもできます。 そのためには、オーバーフローテーブルを作成する必要があります。 このページ ​を参照してください。

Web アプリケーションへの Captcha の追加

公開ランディングページ/サブスクリプションページにキャプチャを追加することをお勧めします。 残念ながら、DCE (デジタルコンテンツエディター)ページにキャプチャを追加するのは簡単ではありません。 ここでは、Captcha バージョン 5 または Google reCAPTCHA を追加する方法について説明します。

DCEでキャプチャを追加する一般的な方法は、パーソナライゼーションブロックを作成して、ページコンテンツ内に簡単に含めるようにすることです。 スクリプト​アクティビティと​ テスト ​を追加する必要があります。

パーソナライゼーションブロック

  1. リソースキャンペーン管理パーソナライゼーションブロック​に移動し、新しいパーソナライゼーションブロックを作成します。

  2. Web アプリケーション​のコンテンツ タイプを使用し、カスタマイズ メニュー​ ​表示を確認します。

    詳しくは、Campaign v8 ドキュメントを参照してください。

    Campaign Captcha の例を示します。

    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 アプリケーションの更新

  1. Web アプリケーションのプロパティにアクセスして、captchaValid​という名前のブール変数を追加します。

  2. 最後のページと​ ストレージ ​アクティビティの間に、スクリプト​と​ テスト ​を追加します。

    ブランチ True​を​ ストレージ ​に接続し、もう1つをCaptchaを持つページに接続します。

  3. 分岐Trueの条件を編集します("[vars/captchaValid]"がTrueに等しい)。

  4. Script アクティビティを編集します。 コンテンツは、選択したCaptcha エンジンによって異なります。

  5. 最後に、パーソナライズされたブロックをページに追加できます。このページ ​を参照してください。

IMPORTANT
reCAPTCHA統合の場合、HTMLにクライアントサイド JavaScriptを追加する必要があります(<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レカプチャ

公式ドキュメント ​を参照してください。

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"/>

recommendation-more-help
campaign-classic-help