WikiChree.COM 新規   編集   添付   管理  



トップ   編集 編集〔GUI〕 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン

Pkript/設定 の変更点

#author("2026-08-31T22:17:36+09:00","default:guide","guide")
* Pkript/設定 [#settings_ref]
#author("2026-09-04T00:06:03+09:00","default:mcp","bot-mcp")
* Pkript/設定 [#ue8500bd]

plugin/pkript.inc.php の設定定数リファレンス。pukiwiki.ini.php で define した値が優先される。
plugin/pkript.inc.php の設定定数、直接呼び出し、セキュリティの仕様リファレンス。定数を define することで動作を変更できる。pukiwiki.ini.php で define した値が優先される。

#contents
- [[Pkript/設定/スクリプトの配置]]: PKRIPT_SCRIPT_DIR, PKRIPT_SCRIPT_EXT, PKRIPT_ALLOW_PAGE_SCRIPT, PKRIPT_PAGE_PREFIX, PKRIPT_BIND
- [[Pkript/設定/データストア]]: PKRIPT_ALLOW_DATA, PKRIPT_DATA_PREFIX, PKRIPT_DATA_MIN_TRUST
- [[Pkript/設定/文法機能]]: PKRIPT_JSX, PKRIPT_REGEX
- [[Pkript/設定/上限値]]: ステップ数、実行時間、メモリ、ページ参照と書き込み、文字列長、import、正規表現バックトラック
- [[Pkript/設定/信頼度]]: 配置場所ごとの信頼度、import と信頼度、PKRIPT_WRITE_MIN_TRUST
- [[Pkript/設定/CSRFトークン]]: wiki.token() が返すトークンの仕様
- [[Pkript/設定/サニタイザ]]: 出力HTMLの自動サニタイズ、style属性で使えるCSS
- [[Pkript/設定/デバッグ]]: PKRIPT_DEBUG, PKRIPT_AST_CACHE, console.log の上限
- [[Pkript/設定/直接呼び出し]]: #name 形式での呼び出しと exist_plugin

** 関連 [#related]

** スクリプトの配置 [#script_location]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_SCRIPT_DIR|string|'plugin/pkript/script/'|ファイルスクリプトの配置ディレクトリ|
|PKRIPT_SCRIPT_EXT|string|'pks,js'|受け付ける拡張子(カンマ区切り、左が優先)|
|PKRIPT_ALLOW_PAGE_SCRIPT|int|1|ページスクリプト(:config/pkript/script/)を有効にするか|
|PKRIPT_PAGE_SCRIPT_FROZEN_ONLY|int|0|ページスクリプトを凍結ページのみに限定するか|
|PKRIPT_PAGE_PREFIX|string|':config/pkript/script/'|ページスクリプトのページ名接頭辞|
|PKRIPT_BIND|int|1|スクリプト名による直接呼び出し(#name 形式)を有効にするか|

PKRIPT_BIND を 0 にすると #pkript(name) と &pkript(name); のみが有効になる([[#bind]] 参照)。


** データストア [#datastore]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_ALLOW_DATA|int|1|data.* によるデータ保存を有効にするか|
|PKRIPT_DATA_PREFIX|string|':config/pkript/data/'|データページの接頭辞|
|PKRIPT_DATA_MIN_TRUST|int|PKRIPT_WRITE_MIN_TRUST|data.set() に必要な最低信頼度|

PKRIPT_ALLOW_DATA を 0 にすると data.get() は常に既定値を返し、data.set() は拒否される。


** 文法機能の有効・無効 [#syntax_flags]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_JSX|int|1|JSX記法(<tag>{expr}</tag>)を有効にするか|
|PKRIPT_REGEX|int|1|正規表現リテラル(/pattern/flags)を有効にするか|

- PKRIPT_JSX を 0 にすると < は比較演算子としてのみ動作する([[Pkript/文法/JSX]] 参照)
- PKRIPT_REGEX を 0 にすると / は除算としてのみ動作する([[Pkript/文法/正規表現]] 参照)


** 正規表現の制限 [#regex_limits]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_REGEX_BACKTRACK|int|100000|1回の照合で許すバックトラック量(ReDoS対策)|
|PKRIPT_MAX_REGEX|int|512|パターンの最大バイト数|


** リクエスト単位の上限 [#request_limits]

1リクエスト内で複数のスクリプトが実行されても、以下は合計値として適用される。

|~定数名|~型|~既定値|~説明|h
|PKRIPT_MAX_STEPS|int|1000000|評価ステップ数|
|PKRIPT_MAX_TIME|float|3|Pkript内での実行時間(秒)|
|PKRIPT_MAX_MEMORY|int|memory_limit の 3/4|メモリ使用量(バイト)|
|PKRIPT_MAX_CONVERT|int|32|wiki.convert() の呼び出し回数|
|PKRIPT_MAX_READS|int|5000|ページ参照回数(wiki.exists / source / pages / link の合計)|
|PKRIPT_MAX_WRITES|int|4|ページ書き込み回数(wiki.write / append の合計)|


** 値単位の上限 [#value_limits]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_MAX_DEPTH|int|64|関数の最大呼び出し深度|
|PKRIPT_MAX_LOOP|int|100000|1ループの最大繰り返し回数|
|PKRIPT_MAX_STRING|int|1048576|文字列の最大バイト数(1MB)|
|PKRIPT_MAX_ARRAY|int|10000|配列の最大要素数|
|PKRIPT_MAX_PAGES|int|1000|wiki.pages() が返せる最大ページ数|
|PKRIPT_MAX_PAGE_BYTES|int|524288|wiki.write() で書けるページの最大バイト数(512KB)|
|PKRIPT_MAX_IMPORTS|int|16|import できる最大スクリプト数|
|PKRIPT_MAX_IMPORT_DEPTH|int|4|import の最大深度|


** 権限・セキュリティ [#security]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_WRITE_MIN_TRUST|int|PKRIPT_TRUST_FILE|ページを書き込める最低の信頼度|
|PKRIPT_IMPORT_LOWER_TRUST|int|0|自スクリプトより低い信頼度のスクリプトの import を許可するか|
|PKRIPT_SECRET_FILE|string|CACHE_DIR . 'pkript_secret.dat'|CSRFトークン秘密鍵の保存場所|


** デバッグ [#debug]

|~定数名|~型|~既定値|~説明|h
|PKRIPT_AST_CACHE|int|1|解析済みスクリプトを cache/ に保存するか|
|PKRIPT_DEBUG|int|1|エラーに行番号・列番号を付与するか、console.log を出力するか|
|PKRIPT_MAX_LOG|int|100|console.log で記録できる行数|
|PKRIPT_MAX_LOG_BYTES|int|8192|console.log 全体の最大バイト数|


** 信頼度 [#trust]

スクリプトの配置場所によって信頼度が決まる。

|~配置場所|~定数|~wiki.write の可否|h
|plugin/pkript/script/(ファイル)|PKRIPT_TRUST_FILE|可|
|:config/pkript/script/(凍結ページ)|PKRIPT_TRUST_FROZEN|不可|
|:config/pkript/script/(編集可能ページ)|PKRIPT_TRUST_PAGE|不可|

読み出し・表示・計算はすべての信頼度で共通。書き込みのみ信頼度で制限される。

*** import と信頼度 [#trust_import]

- 実行全体の信頼度は、関わったすべてのスクリプトの最低値になる
- 自スクリプトより低い信頼度のスクリプトは読み込めない(PKRIPT_IMPORT_LOWER_TRUST = 1 で許可できるが、実行全体の信頼度は低い方に落ちる)


** CSRFトークン [#csrf]

wiki.write / wiki.append はトークンを要求する。トークンはログイン中のユーザーに紐付く。

認証なしのWikiではトークンはサイト共通の値になる(Wikiを読めるユーザーはトークンも読める)。書き込み制限には $edit_auth_pages を使うこと。


** HTMLサニタイザ [#sanitizer]

スクリプトの出力HTMLは自動でサニタイズされる。

- script / iframe 等の危険なタグは無効化
- onclick 等のイベント属性は除去
- href / src の javascript: と data: スキームは除去
- class と id には pkript- 接頭辞が付与

*** style属性 [#style]

プロパティのホワイトリストと値のパターン検査で許可/拒否を判定する。

|~分類|~許可するプロパティ|h
|色・文字|color, background-color, font-*, text-*, line-height, letter-spacing, word-spacing, white-space, word-break, overflow-wrap, list-style*|
|ボックス|margin*, padding*, border*, box-shadow, box-sizing, width, height, min-*, max-*, display, vertical-align, opacity, visibility, overflow*, float, clear, cursor|
|テーブル|border-collapse, border-spacing, table-layout, caption-side, outline*|
|Flexbox|flex*, justify-*, align-*, order, gap, row-gap, column-gap|
|Grid|grid-template-*, grid-auto-*, grid-area, grid-column, grid-row, place-*|
|アニメーション|transition*, animation*, transform, transform-origin, will-change, filter|

禁止されるプロパティ・値:

|~禁止対象|~理由|h
|position / z-index|Wikiレイアウト上に重ねることを防ぐため|
|vw / vh 等のビューポート単位|ウィンドウ全体に広がることを防ぐため|
|url(...) を含む値|外部リソース参照を防ぐため(background-image を含む)|
|expression(...) / javascript: / @import / \ / /*|スクリプト注入を防ぐため|

関数はホワイトリスト制: rgb / rgba / hsl / hsla、translate* / scale* / rotate* / skew* / matrix / perspective、cubic-bezier / steps、repeat / minmax / fit-content、blur 等のfilter関数のみ許可。calc() は現在非対応。

規則に合わないプロパティはそのプロパティのみ除去される(要素は残る)。

animation-name が参照するキーフレームはスクリプトから定義できない(<style> タグはサニタイザが除去する)。


** #name による直接呼び出し [#bind]

PKRIPT_BIND が 1(既定)のとき、#pkript(name) の代わりに #name と書ける。

lib/plugin.php の exist_plugin が実在するPHPプラグインを見つけられなかった場合のみ、同名のスクリプトを探してラッパー関数を生成する。同名のPHPプラグインは常に優先される。

#pkript(highlight){{
#hello(World)
&hello(World);
}}

PKRIPT_BIND を 0 にするとラッパー生成を無効にする。

#pkript(highlight){{
// pukiwiki.ini.php
define('PKRIPT_BIND', 0);   // 既定は 1
}}

exist_plugin を独自改造している環境では以下を exist_plugin 関数内に追加する:

#pkript(highlight){{
if (file_exists(PLUGIN_DIR . 'pkript.inc.php')) {
    require_once(PLUGIN_DIR . 'pkript.inc.php');
    if (function_exists('plugin_pkript_bind') && plugin_pkript_bind($name)) {
        $exist[$name] = TRUE;
        $count[$name] = 1;
        return TRUE;
    }
}
}}

- [[Pkript/文法]] - 言語仕様
- [[Pkript/API]] - 組み込み関数とオブジェクト
- [[PkriptRunner]] - #pks / &amp;pks; でコードをその場に書いて実行する