実際に華和梨でゴーストを作る†
ミドルウェアってなんぞ†
で、ミドルウェアやテンプレートを使うべき?†
作りたいゴーストが、独自の機能を実装するなど、一般的なゴーストを逸脱するかどうかが選ぶ基準かも ミドルウェアやテンプレートを使わないやり方†とりあえず華和梨を使ってみたい・慣れておきたいという方はミドルウェアやテンプレートを使うとして、ここからは1から華和梨ゴーストを制作する基礎
準備†
shiori.dll / 華和梨本体†
kawarirc.kis / 華和梨の設定ファイル、というか最初に読み込む辞書†
全てを決定付ける最初のイベント†
System.Callback.OnGET : ${${System.Request.ID}} System.Callback.OnGET : $(entry ${System.Request.ID})
System.Callback.OnGET : ${OnBoot} System.Callback.OnGET : $(entry OnBoot)
OnBoot : ${起動} 起動 : \0\s[0]ちゃす。\e 書き込んでみよう†
System.Callback.OnGET : $(entry ${System.Request.ID}) System.Callback.OnNOTIFY : $(entry ${System.Request.ID}) OnBoot : \1\s[10]\0\s[0]やあ。\w9\w9\e OnClose : \1\s[10]\0\s[0]うい。\w9\w9\-
全部kawarirc.kisに書くの?†
=kis # 華和梨辞書 load dic01_Base.txt ; load dic02_Event.txt ; # さおり saoriregist mciaudior.dll mciaudior preload ; saoriregist httpc.dll httpc preload ; =end
設定する : $( setstr フラグ "ふつう")$( setstr 満腹度 "100")$( setstr モード "" ) これを 設定する : $(setstr フラグ "ふつう" ; setstr 満腹度 "100" ; setstr モード "" )
全イベントに対応すべき?†必ずしも全てのイベントに対応する必要は「ない」。知らないイベントが来ても、「そんなエントリ名はない」=「からっぽ」で、何もしない事になるのでエラーになったりはしない
OnChoiceSelect : $(entry ${R0})\e リファレンス0には、\q[~,~]で作ったIDが入っているので、その名前のエントリを呼べという意味。これで選択肢も正常に稼動する。 最後に \e をつけているのはどこかで \e を書き忘れた時のための保険 kawarirc.kisに書く事をまとめて突っ込む†
System.Callback.OnGET : $(entry ${System.Request.ID}) System.Callback.OnNOTIFY : $(entry ${System.Request.ID}) =kis # 華和梨辞書。自分の好きな辞書ファイルを作り、登録しましょう load dic01_Base.txt ; load dic02_Event.txt ; =end R0 : ${System.Request.Reference0} R1 : ${System.Request.Reference1} R2 : ${System.Request.Reference2} R3 : ${System.Request.Reference3} R4 : ${System.Request.Reference4} R5 : ${System.Request.Reference5} R6 : ${System.Request.Reference6} R7 : ${System.Request.Reference7} R8 : ${System.Request.Reference8} R9 : ${System.Request.Reference9} OnChoiceSelect : $(entry ${R0})\e homeurl : "http://~" OnBoot : \1\s[10]\0\s[0]やあ。\w9\w9\e OnClose : \1\s[10]\0\s[0]うい。\w9\w9\-
descript.txtに書いておくおまじない†shiori.cache,0
華和梨・自作におけるセキュリティ施工†
概説†上のURLから要点を抜粋
以下、順番に、具体的なセキュリティの施工方法 1.setコマンド等で${System.Request.Reference*}の内容を使わない†
2.debuggerコマンドでonを指定したものを外しておく†
3.大事なエントリは保護しておく†
# 横に長くなるのを防ぐため可能な限り改行してますが1行にまとめもOK System.Callback.OnGET : $( setstr @temp ${System.Request.ID} ; entry "event."${@temp} $( entry "resource."${@temp}) ) System.Callback.OnNOTIFY : $( setstr @temp ${System.Request.ID} ; entry "notify."${@temp} ) 上のを順番に追ってみると…
具体例を挙げると、「OnBoot」が通知された際、【event.OnBoot】エントリを呼ぶようになる。 これまではイベント名そのままのエントリ名を参照していたので、全て【event.OnClose】のように 頭にevent.とかついたエントリ名へ書き換えなければならない
#kawarirc.kisの最後に、以下を追加する =kis listtree @ToProtect System.Callback; listtree @ToProtect event; listtree @ToProtect resource; listtree @ToProtect notify; foreach @i @ToProtect $(writeprotect ${@i}); =end
4.危険なさくらスクリプトタグを通さない†
=kis # 外部SSTPに存在した場合、危険なタグを無害化 # 第1引数: 文字列 # 戻り値: タグを無害化した文字列 function KillDangerousTag $( if $[ $(size @arg) != 2 ] $(return); setstr @string $@arg[1]; foreach @tag kp.dangeroustag $( # 無害化したタグを生成 setstr @killedtag " _"$(substr ${@tag} 2); setstr @pos $(match ${@string} ${@tag}); # 危険タグが存在したら、無害化したタグに置換 if $[ ${@pos} != -1 ] $( setstr @string $(gsub ${@string} ${@tag} ${@killedtag}); ); ); return ${@string}; ); =end # KillDangerousTag内部で参照している危険なタグのリスト # 必ず2文字以上からなるタグを書くこと kp.dangeroustag ( "\\![updatebymyself]", "\\![vanishbymyself]", "\\![enter,passivemode]", "\\![leave,passivemode]", "\\![lock,repaint]", "\\![unlock,repaint]", "\\![biff]", "\\![open,browser", "\\![open,mailer", "\\![raise", "\\j[" ) # タグリストが消されて無効化されないよう、エントリを保護 =kis writeprotect kp.dangeroustag; =end =kis # Reference*参照 # 第1引数: Reference番号 # 戻り値: Reference*の内容 function Reference $(get System.Request.Reference$@arg[1][0]); # 危険なさくらスクリプトタグを無害化した上でReference*参照 # 第1引数: Reference番号 # 戻り値: 危険なさくらスクリプトタグをを無害化したReference*の内容 function SReference $(KillDangerousTag $(Reference $@arg[1])); =end
event.OnCommunicate : ( \1\s[10] \0\s[0] $(SReference 0)が何か言ってるね。\w8\w8\n とりあえず無視しておこっと。\w8\w8 \1危なそうだしな。\w8\w8 \e )
R0 : $(SReference 0) R1 : $(SReference 1) R2 : $(SReference 2) R3 : $(SReference 3) R4 : $(SReference 4) R5 : $(SReference 5) R6 : $(SReference 6) R7 : $(SReference 7) R8 : $(SReference 8) R9 : $(SReference 9)
kawarirc.kisに書くこと最終まとめ例†
System.Callback.OnGET : $( setstr @temp ${System.Request.ID} ; entry "event."${@temp} $( entry "resource."${@temp}) ) System.Callback.OnNOTIFY : $( setstr @temp ${System.Request.ID} ; entry "notify."${@temp} ) =kis # 華和梨辞書。自分の好きな辞書ファイルを作り、登録しましょう load dic01_Base.txt ; load dic02_Event.txt ; =end R0 : $(SReference 0) R1 : $(SReference 1) R2 : $(SReference 2) R3 : $(SReference 3) R4 : $(SReference 4) R5 : $(SReference 5) R6 : $(SReference 6) R7 : $(SReference 7) R8 : $(SReference 8) R9 : $(SReference 9) resource.homeurl : "http://~" event.OnChoiceSelect : $(entry ${R0})\e event.OnBoot : \1\s[10]\0\s[0]やあ。\w9\w9\e event.OnClose : \1\s[10]\0\s[0]うい。\w9\w9\- =kis # 外部SSTPに存在した場合、危険なタグを無害化 # 第1引数: 文字列 # 戻り値: タグを無害化した文字列 function KillDangerousTag $( if $[ $(size @arg) != 2 ] $(return); setstr @string $@arg[1]; foreach @tag kp.dangeroustag $( # 無害化したタグを生成 setstr @killedtag " _"$(substr ${@tag} 2); setstr @pos $(match ${@string} ${@tag}); # 危険タグが存在したら、無害化したタグに置換 if $[ ${@pos} != -1 ] $( setstr @string $(gsub ${@string} ${@tag} ${@killedtag}); ); ); return ${@string}; ); =end # KillDangerousTag内部で参照している危険なタグのリスト # 必ず2文字以上からなるタグを書くこと kp.dangeroustag ( "\\![updatebymyself]", "\\![vanishbymyself]", "\\![enter,passivemode]", "\\![leave,passivemode]", "\\![lock,repaint]", "\\![unlock,repaint]", "\\![biff]", "\\![open,browser", "\\![open,mailer", "\\![raise", "\\j[" ) # タグリストが消されて無効化されないよう、エントリを保護 =kis writeprotect kp.dangeroustag; =end =kis # Reference*参照 # 第1引数: Reference番号 # 戻り値: Reference*の内容 function Reference $(get System.Request.Reference$@arg[1][0]); # 危険なさくらスクリプトタグを無害化した上でReference*参照 # 第1引数: Reference番号 # 戻り値: 危険なさくらスクリプトタグをを無害化したReference*の内容 function SReference $(KillDangerousTag $(Reference $@arg[1])); =end #kawarirc.kisの最後に、以下を追加する =kis listtree @ToProtect System.Callback; listtree @ToProtect event; listtree @ToProtect resource; listtree @ToProtect notify; foreach @i @ToProtect $(writeprotect ${@i}); =end
続き→ らくだ屋/里々から華和梨への移行ガイド・SHIORI Event実装編 |