Re: write18の注意点

名前: ZR
日時: 2007-10-17 16:52:00
IPアドレス: 122.18.235.*

>>49860 > すみません。便乗で質問させてください。 > それでしたら、\csnameと\meaningと\writeが存在したらTeXコンパイルをさせない、 > のようにすれば悪意あるコマンドが実行されることはないでしょうか? 確かにそれで正しいのですが、そうすると「じゃあどうやって \csname の 存在を判定するか?」ということで >>49837 の問題に戻ってしまいます。 直接 "\xxxx" の形で書けるプリミティブの集合を十分に制限すれば、 そこから他のプリミティブが実行される可能性がなくなることは確かです。 例えば、"\relax" と "\empty" しか "\xxx" の形が書けないとすると、 他のプリミティブもマクロも呼び出せないことは明らかですね。 しかし、「普通に LaTeX として使える」だけの命令を残し、しかも \write 等を発生しないような「安全集合」を得るのは困難を極めるでしょう。 例えば、下のソースは LaTeX2e 標準の命令しか含んでいませんが、\write18 が実行されてしまいます。(しかも "write" や "18" を見つけ難い。) \documentclass{article} \renewcommand*{\alpha}{ite} \begin{document} \setcounter{section}{17} \section{Foo} \begin{wr\alpha}\value{section} {touch hoge} \end{wr\alpha} \end{document} 勿論、この \begin の引数に '\' を入れることを禁止すれば、この点は 防げます。しかし、まだ他の抜け穴があるかもしれません。恐らく、 LaTeX の命令を一つ一つ調査しなければ安全確認はできないでしょう。 # TeX の \write18 の処理自体に手を入れるという方法は有効かも # しれません。

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)