外部からの入力に関するTIPS。

ユーザ名の入力、他ゴーストへ切り替えを行う時に相手の名前を呼ぶなど、
どんな文字が来るか分からない場合、対策しておかないと危険な場合があります。




何がおこるのか

ユーザ名を入力してもらって、以降その名前で呼ぶとします。
このときユーザ名に「\![vanishbymyself]」と入力されたりするかもしれません。
\![vanishbymyself]は、その場で自分自身をアンインストールするさくらスクリプトです。
もしこの入力をそのままユーザ名に設定してしまうと、
今後ゴーストがユーザ名を呼ぶたびに自分自身をアンインストールするという非常に困った事態になってしまいます。
他にも、外部サイトから情報を取得する「\![execute,http-get,URL]」なども危険です。
外部入力による予期せぬ動作を防ぐ必要があります。

対策

外部入力からのさくらスクリプトを無効化する必要があります。

KillDangerousTag関数

里々のサンプルゴーストである「Rポストと狛犬」には、既に便利な機能が入っています。
基本的に自分の辞書からでない文字列は、これを使えば安全です。
dic00_system.txtに記述されているので、活用しましょう。

*
:(call(バイト値、1)KillDangerousTag(バイト値、1)\![vanishbymyself]を実行するぞ!)

このように記述すると、\![vanishbymyself]は実行されず、バルーンに以下のように出力されます。

\![vanishbymyself]を実行するぞ!

\_?を使う(SSP専用)

\_?で挟まれた範囲のさくらスクリプトは実行されず、そのまま表示されます。

*
:もうゴーストやめてやるー! \_?\![vanishbymyself]\_?

出力結果は以下となります。

もうゴーストやめてやるー! \![vanishbymyself]

注意点として、\_?はSSPにしか実装されていません。
この方法を使う場合、配布ページやreadmeに、SSPでしか動作しないことを記述しておく必要があります。

自分で置き換え処理を作る

上記のKillDangerousTag関数を使うのが一番簡単ですが、自分で対策を作ることも可能です。
半角\記号はさくらスクリプトで使われるため、ただ「\」と書いてもバルーンに表示されません。
半角\記号をバルーンに表示するには、「\\」と表示します。
また、\\と書いた場合にはさくらスクリプトとして解釈されません。

*
:メガンテ! \\![vanishbymyself]!

このように書いた場合、バルーンには以下のように表示され、\![vanishbymyself]は実行されません。

メガンテ! \![vanishbymyself]!

全ての半角\記号を「\\」と置き換えてしまう処理を作ります。

@さくらスクリプト無効化
(replace(バイト値、1)(A0)(バイト値、1)\(バイト値、1)\\)

使い方は以下です。

*
:(call、さくらスクリプト無効化、\![vanishbymyself]も\![execute,http-get,URL]もぜんぶ無効化だ!)

出力結果は以下となります。

\![vanishbymyself]も\![execute,http-get,URL]もぜんぶ無効化だ!

使うべき場所

基本的に、辞書に書いている部分には使用する必要はありません。
外部から入力された文字列など、何が入っているか分からない部分に使用します。
以下に例を挙げます。

ユーザ入力は「Rポストと狛犬」で対策済みなので、ここではゴースト切り替え時の対策を記述します。

ゴースト切り替え反応

普通は以下のように記述しますが、もし\![vanishbymyself]なんて名前のゴーストが発表された場合に困ります。

*他のゴーストへ変更
>(R0)へ変更
:(R0)さんに交代します。

そこで、先ほどのKillDangerousTag関数を使用して書き換えます。

*他のゴーストへ変更
>(R0)へ変更
:(call(バイト値、1)KillDangerousTag(バイト値、1)(R0))さんに交代します。

または、\_?でさくらスクリプトを無効化しておきます。
前述のとおり、この記述はSSP専用です。

*他のゴーストへ変更
>(R0)へ変更
:\_?(R0)\_?さんに交代します。

補足

なお、以下はきちんと動作し、さくらスクリプトは実行されません。

*
>\![vanishbymyself]

*\![vanishbymyself]
消えないでトークをするよ!

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-05-01 (日) 23:27:08