PowerCMS X ブログ

2021-05-19

モディファイア「escape」の指定ルール

グローバルモディファイア「escape」は利用する頻度の高いモディファイアだと思いますが、どのようなケースで指定すべきかの考え方を纏めました。適切に指定しなければ脆弱性に繋がるケースもありますし、HTMLを壊してしまう可能性もあります。ビュー ( テンプレート・タグ ) を書くことのある人は是非ご一読いただき、理解いただくことをお勧めします。

escape 値をHTMLエンティティに変換またはその他の形式にエンコードします。 'html', 'xml', 'js', 'json', 'json_unescaped_unicode', 'php', 'url', 'single'(既存のHTMLエンティティをエンコードしない)のいずれかで、省略した場合は特殊文字がHTMLエンティティに変換されます

属性値を指定しない場合、もしくは'html', 'single'を指定した場合は、以下のルールで変換を行います。

変換前 変換後
& (アンパサンド) &
" (ダブルクォート) "
< (小なり) &lt;
> (大なり) &gt;

既存の HTMLエンティティを二重にエスケープしたくない場合は、escape="single" が指定できます。尚、PowerCMSでは escape="html" となり属性値は省略できないので違いに注意してください。

PowerCMS Xには「encode_html」モディファイアがありません。次のバージョンで追加されます。

原則・escapeモディファイアを利用する箇所と指定の順番に関する注意点

グローバルモディファイアは複数指定できます(ただし、同じグローバルモディファイアを1つのタグの中には指定できません)。グローバルモディファイアは左から順番に適用されます。よって、以下の例では意図通りエスケープされません。

<mt:entrytitle setvar="title" escape>
<mt:var name="title">

以下のようにする必要があります(ただし、このような指定では見通しが悪くなりがちで、エスケープ指定しているのかしていないのかがわかりにくくなります)。

<mt:entrytitle escape setvar="title">
<mt:var name="title">

よって、「escapeモディファイアは、出力する箇所で指定するのが原則である」と覚えておいてください。

<mt:entrytitle setvar="title">
<mt:var name="title" escape>

1. (重要) ダイナミック・パブリッシングでユーザーがパラメタに渡した文字列を出力する箇所で指定する

ダイナミックパブリッシング (検索ページやフォームの確認画面など) で <mt:var name="request.パラメタ名"> とすることで、URLパラメタや POSTされた値を出力することができます。このタグをダイナミック・パブリッシング(動的生成)で出力する HTMLページに利用する場合は、必ず escapeを指定してください。指定しなければ、XSS ( クロスサイトスクリプティング ) の脆弱性に繋がります。

  • ダイナミック・パブリッシング内でパラメタを出力する箇所 ( 「<mt:var name="request.query" escape>」の検索結果 )

<mt:var name="request.パラメタ名">に escapeモディファイアを付けないで構わない唯一の例外は、メールテンプレート (HTMLメールを除く) の中でこのタグを利用する場合だけです。

2. HTMLタグを置くことのできない箇所で指定する

title要素や属性値の中など、HTMLタグを置くことのできない箇所にテンプレート・タグを書く場合は必ず指定すると覚えておくと良いと思います。remove_htmlをあわせて指定しても良いと思いますが、「>」のみを単独で利用している文字列を出力する場合などはそのまま出てしまう可能性がありますので escape モディファイアの指定は必須です。

  • title要素の中 (<title><mt:entrytitle escape> | <mt:websitename escape></title>)
  • 属性値の中 (<img src="<mt:assetfileurl escape="url">" alt="<mt:assetlabel escape>"> , <meta property="og:description" content="<mt:entrytitle escape>">)

3. JavaScriptコードやJSONテキストの中で指定する

「"」などがそのまま出力されることによってスクリプトやJSONが壊れてしまう可能性のある箇所に指定します。

  • JavaScript内の文字列 ( var title = "<mt:entrytitle escape="js">"; / var title = "<mt:entrytitle escape>"; )
  • JSON内の文字列 ( {"title" : "<mt:entrytitle escape="json">"} / {"title" : "<mt:entrytitle escape="json_unescaped_unicode">"} )

4. URLパラメタに渡す文字列に対して指定する

  • href属性の中 ( <a href="/search.html?tag=<mt:tagname escape="url">"><mt:tagname escape></a> )

escape="url" に代わりに encode_url モディファイアを指定することでも同様の結果が得られます。

5. RSSやXMLサイトマップなどのXMLの中で指定する

  • XMLの中 ( <title><mt:entrytitle escape="xml"></title> )

escape="xml" に代わりに encode_xml モディファイアを指定することでも同様の結果が得られます。encode_xml="cdata" とすることでエスケープせずに CDATAセクションとして出力することもできます。

6. PHPコードの中で指定する

PHPコードの中にテンプレート・タグを出力するようなケースでは、ビューの書き方によってはセキュリティのリスクに繋がる可能性があります。以下の例では記事のタイトルに「'」(シングルコーテーション)を入力するとPHPがコンパイルエラーとなり、「';」を入力すると、その後に入力した任意のPHPコードを実行できてしまいます。必ず escape="php" を指定するか、encode_phpモディファイアを指定することでも同様の結果が得られます。

  • PHPコードの中 ( <?php $str = '<mt:entrytitle escape="php">'; ?> )

カテゴリー:テンプレート作成Tips | 技術情報

投稿者:Junnama Noda

2021-04-28

環境変数の設定方法

はじめに

この記事では、 PowerCMS X の環境変数の設定方法をご説明します。

PowerCMS X には、 CMS の設定を変更できる、各種「環境変数」があります。
例えば、デバッグモードの有無を指定する「debug」、画像アップロード時の画質を指定する「image_quality」などです。
指定がない場合は、すべて初期値が反映されます。
環境変数の内容については、「環境変数リファレンス」をご覧ください。環境変数名、説明、初期値を記載しております。

環境変数を設定する方法は、2種類あります。
PowerCMS X の管理画面で入力する方法と、サーバー内の設定ファイルに入力する方法です。

環境変数の設定方法 (管理画面で入力する)

PowerCMS X の管理画面で環境変数を入力する場合、あらかじめ AppProperties プラグインの有効化が必要です。
参照: プラグインの設定方法と、タグリファレンスの表示方法

AppProperties プラグインを有効化する方法

  1. PowerCMS X の管理画面の、システムメニューの [ツール] - [プラグイン管理] をクリックします。

  2. 「AppProperties」 の [プラグインを有効化] をクリックします。

  3. 画面に [スキーマのアップグレード] のリンクが表示されます。スキーマ管理の画面で、「app_property」のチェックを入れて、 [アップグレード] をクリックします。

  4. ダッシュボードに移動して、システムメニューの [システムオブジェクト] をクリックし、 [環境変数] メニューが追加されたことを確認します。

管理画面で環境変数を入力する方法

  1. PowerCMS X の管理画面の、システムメニューの [システムオブジェクト] - [環境変数] をクリックします。環境変数の一覧画面が表示されます。

    スクリーンショット: システムメニューの、システムオブジェクトの「環境変数」をクリックする

  2. [新しい環境変数] をクリックします。環境変数の編集画面が表示されます。

    スクリーンショット: 「新しい環境変数」をクリックする

    スクリーンショット: 「新しい環境変数」の編集画面

  3. 設定する環境変数の「名前」「値」「タイプ」を指定し、 [保存] をクリックします。
    タイプは、データ型に応じて選択します。 (初期値が定義されている環境変数は、保存時に自動的に設定されます。)

    • 文字列
    • 数値
    • 浮動小数点 (DOUBLE)
    • 真偽値
    • 配列
    • JSON

    例: デバッグモードを有効化する場合
    次のように指定して保存します。
    管理画面の下部に、実装者向けの情報が表示されます。 (Request completed in ……)

    • 名前: debug
    • 値: true
    • タイプ: 真偽値

    スクリーンショット: 「新しい環境変数」の設定例。設定内容は本文に記載。

    スクリーンショット: 環境変数の一覧画面

※注: 管理画面で設定できない環境変数

管理画面で設定できず、サーバー内の設定ファイルでのみ設定できる環境変数もあります。
(設定を試みた場合、エラーメッセージ「環境変数'<環境変数名>'は設定できません。」が表示されます。)

製品パッケージ内の禁止リストに記載の環境変数は、管理画面での設定を禁止しています。
パス: PowerCMSX/plugins/AppProperties/blacklist/blacklist.txt
また、名前に「_path」や「_dir」を含む環境変数も、管理画面での設定を禁止しています。

また、config.jsonに記載のある環境変数については、config.jsonに指定の値が優先され、管理画面から登録はできません。

管理画面から設定できる例
  • user_css
  • panel_limit
  • use_comment
  • mirroring_servers
管理画面から設定できない例
  • memory_limit
  • mysqldump_path
  • plugin_dirs
  • mirroring_staging_root_path

環境変数の設定方法 (設定ファイルに入力する)

設定ファイルに入力する場合、サーバー内のアプリケーションディレクトリ配下の設定ファイルを編集します。

アプリケーションディレクトリは、 PowerCMS X 製品パッケージを配置したディレクトリです。 (例: /var/www/powercmsx)
PowerCMS X の設定ファイルは、 config.json です。 (例: /var/www/powercmsx/config.json)
config.json ファイル内の config_settings 部分に、環境変数を入力します。

※注: JSON 形式で入力し、最後の環境変数の末尾は、「,」 (カンマ) をつけないようにしてください。


例: デバッグモードを有効化する場合
config.json ファイル内の config_settings に、「"debug" : true」を入力して保存します。
一部抜粋:

    "config_settings": {
        "do_conditional" : false,
        "debug" : true
    }

環境変数の参照方法

環境変数は、ビューでテンプレートタグを指定して参照できます。
テンプレートタグ「mt:property」の、 name 属性に環境変数名を指定することで、環境変数の値を出力できます。

例:

<p>一時格納ディレクトリのパス: <mt:property name="temp_dir"></p>
<p>画像アップロード時の画質: <mt:property name="image_quality"></p>
<p>デバッグモード: <mt:property name="debug" to_json></p>
<p>対応言語: <mt:property name="languages" to_json></p>

出力結果:

<p>一時格納ディレクトリのパス: /var/www/tmp</p>
<p>画像アップロード時の画質: 100</p>
<p>デバッグモード: true</p>
<p>対応言語: ["ja","en"]</p>

おわりに

環境変数の設定方法をご紹介しました。

管理画面で入力する方法の利点は、操作しやすい、値を変更して確認しやすいなどです。
設定ファイルに入力する方法の利点は、設定ファイルごとバックアップできる、まとめて指定できる、すべての環境変数を指定できるなどです。
必要に応じてご利用ください。実装の際の参考になりましたら幸いです。

アルファサードでは、無償でご利用いただける PowerCMS X 評価版のご提供の他、オンラインでのお打ち合わせ、製品説明のご希望もお受けしております。
ご不明の点がございましたら、 PowerCMS X のお問い合わせフォームからお問い合わせください。

お問い合わせ

カテゴリー:プラグイン | 技術情報

投稿者:kaida

2021-03-23

オブジェクトをループ出力するタグ (例 : mt:entries) のさまざまなフィルタリングについて

オブジェクトをループ出力するタグ (例 : mt:entries) では、さまざまなタグ属性によってフィルタリングが可能となっています。バージョンアップで指定できる属性が増えていますので、整理する意味で利用できるフィルタをご紹介します。まず、以下はMTMLReferenceプラグインによる mt:entriesのドキュメントです。

タグ 説明 タグ属性
<mt:entries> ~ </mt:entries> '記事' オブジェクトをループ出力します。
予約変数
  • __first__ : ループの初回に1がセットされます
  • __last__ : ループの最終回に1がセットされます
  • __odd__ : ループの奇数回に1がセットされます
  • __even__ : ループの偶数回に1がセットされます
  • __counter__ : ループのカウンター(1から始まる)
  • __index__ : 'var'属性が与えられた時、ループのカウントがセットされます
  • __total__ : ループの総回数がセットされます(配列またはオブジェクトの数)
  • sort_by : 指定のカラム値で記事をソートする。フィールドでのソートを指定する場合"field:basename numeric"のように指定することも可能
  • sort_order : 'ascend(昇順)' または 'descend(降順)'
  • offset : N記事目からリストを開始する(Nは正の整数)
  • limit : 表示する件数(数値)
  • lastn : 「published_on」カラムもしくは最初の日付型のカラムを基準にして最新N件のオブジェクトを取得する
  • options : $termsの配列(loadメソッドの第1引数)
  • (column name[s]) : 指定のカラム名の値でフィルタリングする
  • conditions : カラム名をキー、フィルタ条件(例:like),フィルタする値のカンマ区切りテキストを値にした配列(ハッシュ)
  • include_draft : 公開されていない下書きなどのオブジェクトを含む
  • status : 指定の値に一致するステータスのオブジェクトを含む
  • status_lt : 指定の値より小さいステータスのオブジェクトを含む
  • status_not : 指定の値に一致しないステータスのオブジェクトを含む
  • (relation name[s]) : リレーション先のオブジェクトのプライマリカラムの値もしくは階層付きモデルの場合「Path/To/オブジェクト名」でフィルタリングする
  • (field:basename[s]) : 指定のフィールド名の値でフィルタリングする
  • field_and_or : 指定のフィールド名の値でフィルタリングする時、AND条件かOR条件を指定する
  • author : オブジェクトがカラム'user_id'もしくは'created_by'をもつ場合、ユーザー名でフィルタリングする
  • ignore_archive_context : アーカイブコンテキストを無視しフィルタリングをせずオブジェクトをロードする
  • include_workspaces : 記事に'workspace_id'カラムが存在する時、指定のスペースに存在するオブジェクトに絞り込む(カンマ区切りの数字または'this'または'all'または'children')
  • exclude_workspaces : 記事に'workspace_id'カラムが存在する時、指定のスペースに存在しないオブジェクトに絞り込む(カンマ区切りの数字)
  • workspace_id : スペースIDでの絞り込み
  • workspace_ids : 'include_workspaces'のエイリアス
  • ids : 指定のIDの記事を出力(カンマ区切りの数字)
  • exclude_ids : 指定のIDに一致しない記事を出力(カンマ区切りの数字)
  • unique : 同一ページで出力された記事を除外する
  • shuffle : sort_by属性指定のない時オブジェクトをシャッフルする
  • ignore_filter : ダイナミックパブリッシング時にオブジェクトをフィルタをするパラメータを無効にする
  • cols : SELECT文の対象とするカラム名(カンマ区切り)
  • glue : 繰り返し処理の際に指定された文字列で各ブロックを連結する

カラムの値によるフィルタ

モデルのカラム名を属性に指定して完全一致するもののみを絞り込みます(以下に紹介するフィルタはすべて組み合わせて使うことができます)。

<mt:entries title="記事のタイトル" keywords="記事のキーワード">
<mt:entrytitle>
</mt:entries>

ver.2.5からは、リレーション型のカラムも指定できるようになりました。以前のように「mt:setcontext」ブロックで囲む必要はなくなりました。AND | OR | NOT指定ができ、属性名はカラム名(categories, tags)でもモデル名(category, tag)でも構いません。もちろんリレーション以外のカラム名の属性と併用することができます。

<mt:entries categories="カテゴリ名1 OR カテゴリ名2" tags="タグ名1 AND タグ名2">
<mt:entrytitle>
</entries>

単一指定の時、階層付きモデルの属性値に「/」を付けることで、パスの指定が可能です。

<mt:entries category="プレスリリース/PowerCMS X">
<mt:entrytitle>
</entries>

options属性によるフィルタ

options属性で "カラム名1", "値1","カラム名2", "値2"... のような配列を渡すことで複数のカラムの値によるフィルタをまとめて指定することができます。

<mt:setvar name="options" value="title">
<mt:setvar name="options" value="記事のタイトル" function="push">
<mt:setvar name="options" value="keywords" function="push">
<mt:setvar name="options" value="記事のキーワード" function="push">
<mt:entries options="$options">
<mt:entrytitle>
</mt:entries>
# CSVで渡す場合
<mt:entries options="'title','記事のタイトル','keywords','記事のキーワード'">
<mt:entrytitle>
</mt:entries>

フィールドによるフィルタ

フィールド(カスタムフィールド)をフィルタリングに利用することができます。複数のフィールドを利用してフィルタリングする時、field_and_orで AND | OR を指定できます。

<mt:entries field:basename="1" field:basename2="1" field_and_or="OR">
<mt:entrytitle>
</mt:entries>

condition属性によるフィルタ

ver. 2.4から利用できるようになった conditions属性では複数の条件を柔軟に組み合わせてフィルタリングすることができます。以下の例はタイトルに「Welcome!」を含み(部分一致)、本文に「Story」を含み、公開日が2021年1月1日以前の記事に絞り込みます。

<mt:sethashvars name="conditions">
title=like,Welcome!
text=like,Story
published_on=lt,2021-01-01 00:00:00
</mt:sethashvars>
<mt:entries conditions="$conditions">
<mt:entrytitle>
</mt:entries>

conditions属性には「カラム名=フィルタ条件,フィルタの値」という形式でハッシュ変数を生成して渡します。

指定可能なフィルタ

フィルタ 説明
ct (like) Contains (含む)
nc Not Contains (含まない)
gt Greater Than (より大きい)
lt Less Than (より小さい)
ge Greater than or Equal (以上)
le Less than or Equal (以下)
eq Equal (等しい)
ne Not Equal (等しくない)
bw Begin with (から始まる)
ew End with (で終わる)

日付によるフィルタ

「mt:setcontext」ブロックタグを使うことで、日付によるフィルタリングを行うことができます。以下の例では2021年3月22日の記事のみを抽出します。尚、ver2.55で環境変数「weak_date_context」が追加されました。指定のある時、日付のフィルタリングは「published_on」カラムのみが対象となります。指定のないときは「published_on」カラムがあるときは published_on、ない場合は日付と時刻型の1つめのカラムでのフィルタリングとなります。

<mt:setcontext timestamp="20210322000000" timestamp_end="20210322235959">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

「mt:setcontext」ブロックによるリレーションでのフィルタ

ver.2.55未満のバージョンではリレーションによる絞り込みについても「mt:setcontext」ブロックタグを使います。こちらについては AND | OR | NOT指定はできません。

<mt:setcontext context="category" container="entry" label="プレスリリース">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>
# id指定の場合
<mt:setcontext context="category" container="entry" id="カテゴリのID">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

カテゴリのように階層設定のあるモデルの場合、path属性を使うことができます。

<mt:setcontext context="category" container="entry" path="プレスリリース/PowerCMS X">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

カテゴリー:テンプレート作成Tips | 技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ