40: [SATORIYA]OnUserInputに里々スクリプトを入力したら括弧展開時に異常行動

ばぐとら研究所統合ToDo管理システムへようこそ!バグ報告に限らず様々な要望を扱うシステムです。
まずは同じような内容がないか [検索] した後、無ければ [新規レポート] で作ってみましょう。
Windows 8以降、高速スタートアップが実装された関係で、SSP以外の部分に起因する不具合発生が出てきました。
何か挙動がおかしいかな、と思ったら、一度再起動(シャットダウン->起動ではなく)してみてから再度確かめてみてください。

最新状況

名前 Don
概要 [SATORIYA]OnUserInputに里々スクリプトを入力したら括弧展開時に異常行動
状態 [?]意見求む
作成日時 2008-09-09 01:22:27
最終更新日時 2008-09-23 19:43:56

履歴

1 | 2008-09-09 01:22:27 | [−]新規
legokichi
SATORIYA 里々 phase Mc143-10にて

インプットボックスから里々スクリプトを入力して結果を得ようとしま
して、
############

*OnMouseDoubleClick
\![open,inputbox,里々スクリプト,60000,]

*OnUserInput
$教えてもらった内容	(R1)
>(R0)を教えてもらった

*里々スクリプトを教えてもらった
(replace,(教えてもらった内容),,)

############

以上のようなスクリプトをゴーストに組み込んで実行してみました。
まず始めに
「(pwd)」
と打ち込んでみたところ、\以外は大体表示されました。
そこで、\を\\に置き換えるべく
「(replace,(pwd),\,¥)」
と入力したところ、以下のれしばログが得られました。

############

--- Request ---
GET SHIORI/3.0
ID: OnUserInput
Reference0: 里々スクリプト
Reference1: (replace,(pwd),\,¥)
--- Operation ---
*OnUserInput
  (R1)→(replace,(pwd),\,¥)
  $教えてもらった内容=(replace,(pwd),\,¥)/overwritten.
  (R0)→里々スクリプト
  *里々スクリプトを教えてもらった
  (教えてもらった内容)→(replace,(pwd),\,¥)
  (pwd)→D:\system\ghost\scallion\ghost\master\
  (replace,D:\system\ghost\scallion\ghost\master\,\,¥)→D:¥system¥ghost¥scallion¥ghost¥master¥
  (replace,(replace,(pwd),\,¥),,)→引数の個数が正しくありません。
  return: \1引数の個数が正しくありません。\n
status code : 200
--- Response ---
Value=\1引数の個数が正しくありません。\e

############

注目していただきたいのは
「  (replace,D:\system\ghost\scallion\ghost\master\,\,¥)→D:¥
system¥ghost¥scallion¥ghost¥master¥」
と
「  (replace,(replace,(pwd),\,¥),,)→引数の個数が正しくあ
りません。」

先にreplaceの中身を展開している実行結果が得られているのにも関わら
ず、
最終的には一切の処理を無効化しており、矛盾しています。

ここで問題になるのが元々里々はReferenseに入っている括弧をどう扱っ
てきたか。正直覚えていません。
里々としては、セキュリティ上Referense内の括弧を先にエスケープして
しまうべきでしょう。
ところが、はたしてReferenseを勝手に改竄していいものなのか、これも
問題です。

現状としては「とりあえず実行はするが、結果は反映しない」というこ
とでしょうか。
しかしそれでは(単語群の追加)等も出来ることになってしまいかねま
せん。
それとも、これは単にれしばへの表示ミスなのでしょうか。

実行するのか、しないのか。どちらかに絞るべきだと思います。

2 | 2008-09-10 12:31:05 | [−]新規
ぽな@ばぐとら
replace外側のパラメータが空文字列なので「なかったこと」になってい
ます。ですので、引数不足エラーになり実行されていません。
エラー内容は表示の通りで、意図的に何かしているわけではありません
ので、上記推測は誤りです。

里々内部では特にPerlのdirtyフラグ+taintモードのような汚染テキス
ト対策は行っていません。現在のところ引数自動計算を適宜OFFにして自
衛するコードを書くか、完全にエスケープするかの方法しかありませ
ん。

3 | 2008-09-11 23:48:52 | [−]新規
legokichi
> replace外側のパラメータが空文字列なので「なかったこと」になっています。ですので、引数不足エラーになり実行されていません。
replaceは空文字列でもエラーは出ませんでした。

--- Request ---
GET SHIORI/3.0
ID: OnUserInput
Reference0: 里々スクリプト
Reference1: (pwd)
--- Operation ---
*OnUserInput
  (R1)→(pwd)
  $教えてもらった内容=(pwd)/overwritten.
  (R0)→里々スクリプト
  *里々スクリプトを教えてもらった
  (教えてもらった内容)→(pwd)
  (pwd)→D:\system\ghost\scallion\ghost\master\
  (pwd)→D:\system\ghost\scallion\ghost\master\
  (replace,(pwd),,)→D:\system\ghost\scallion\ghost\master\
  return: \1D:\system\ghost\scallion\ghost\master\\n
status code : 200
--- Response ---
Value=\1D:\system\ghost\scallion\ghost\master\\e

また、以下のような実験をしてみました。

#####

*OnMouseDoubleClick
\![open,inputbox,里々スクリプト,60000,]

*OnUserInput
$教えてもらった内容	(R1)
>(R0)を教えてもらった

*里々スクリプトを教えてもらった
(call,実験,(教えてもらった内容))

@実験
(loop,実験2,(Aの数))

@実験2
(A(calc,(実験2カウンタ)-1))☆

#####

以下がれしばのログです。

--- Request ---
GET SHIORI/3.0
ID: OnUserInput
Reference0: 里々スクリプト
Reference1: (replace,(pwd),\,¥)
--- Operation ---
*OnUserInput
  (R1)→(replace,(pwd),\,¥)
  $教えてもらった内容=(replace,(pwd),\,¥)/overwritten.
  (R0)→里々スクリプト
  *里々スクリプトを教えてもらった
  (教えてもらった内容)→(replace,(pwd),\,¥)
  (pwd)→D:\system\ghost\scallion\ghost\master\
  (replace,D:\system\ghost\scallion\ghost\master\,\,¥)→D:¥system¥ghost¥scallion¥ghost¥master¥
  @実験
  (Aの数)→4
  @実験2
  (実験2カウンタ)→1
  (calc,1-1)→0
  (A0)→(replace
  (実験2)→(replace☆
  @実験2
  (実験2カウンタ)→2
  (calc,2-1)→1
  (A1)→(pwd)
  (実験2)→(pwd)☆
  @実験2
  (実験2カウンタ)→3
  (calc,3-1)→2
  (A2)→\
  (実験2)→\☆
  @実験2
  (実験2カウンタ)→4
  (calc,4-1)→3
  (A3)→¥)
  (実験2)→¥)☆
  (pwd)→D:\system\ghost\scallion\ghost\master\
  (replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥) not found.
  (loop,実験2,4)→(replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥)☆
  (実験)→(replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥)☆
  (replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥) not found.
  (call,実験,(replace,(pwd),\,¥))→(replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥)☆
  return: \1(replace☆D:\system\ghost\scallion\ghost\master\☆\☆¥)☆\n
status code : 200
--- Response ---
Value=\0\s[0]\1\s[10]\1(replace☆
D:\system\ghost\scallion\ghost\master\☆\☆¥)☆\e

明らかに括弧の展開が異常かと思われます。

4 | 2008-09-21 12:08:24 | [?]意見求む
Don
まず、里々でReferenceに(hoge)とあった場合は()は展開されませ
ん。φ(hogeφ)として表示されます。
一方、

*
(replace,φ(てすとφ),,)

@てすと
ほげ

これを実行すると「ほげ」が表示されます。ここまでは里々の仕様のよ
うですのでお試しください。

以上の2点を踏まえて、legokichiさんが最初に示したスクリプトは

*
(replace,φ(replace,φ(pwdφ),\,¥φ),,)

これを実行することと等価となります。
内部の括弧は展開されないので必然的に引数不足エラーとなります。
最後の実験も

*
(call,実験,φ(replace,φ(pwdφ),\,¥φ))

これを実行することと等価であり、
return: \1(replace☆D:\system\ghost\scallion\ghost\master\☆\☆
¥)☆\n
は正しい結果を表示しておりますので、矛盾はありません。

5 | 2008-09-21 12:17:56 | [?]意見求む
Don
replaceを実行する際、引数不足は明らかなのに、先にφ(φ)の展開を
実行して結果を得ているのは確かに無駄かもしれませんね。
問題の本質はそちらにあったのかも。勘違いしていたらごめんなさい。

6 | 2008-09-23 19:43:56 | [?]意見求む
Don
引数"不足"じゃない、間違えた。すみません。以後引数エラ
ーと呼びますね。

*
(replace,φ(てすとφ),,)

これが展開されるのが解せないというか、不思議に感じるところはある
かもしれません。
ひとつの引数内で括弧が閉じてさえいれば大丈夫、しかし、

*
(replace,φ(replace,φ(pwdφ),\,¥φ),,)

の",φ(replace,"の部分のように、引数内で閉じていなけれ
ば、右の","は最初のreplaceの引数区切りとして解釈される
のは妥当な仕様だと思います。
ところで、中央の",φ(pwdφ),"は展開されるべきだと思い
ます。
展開されたことで","(外の関数の引数区切り)が出現して外
から見ると引数の数が合わなくても、展開後最終的に引数の数が合う場
合もありそうですし。そういう意図でコードを書く場合もあると思いま
す。

[リプライをつける]
Bug Tracking System 影舞 0.8.8
Powered by Ruby 1.8.7