web-dev-qa-db-ja.com

Perl -ne '...'の実行によるセキュリティへの影響*

どうやら、実行中:

Perl -n -e 'some Perl code' *

または

find . ... -exec Perl -n -e '...' {} +

(と同じ -p の代わりに -n

または

Perl -e 'some code using <>' *

このサイトに投稿されたワンライナーによく見られる、セキュリティへの影響があります。どうしたんだ?それを避ける方法は?

30

@StéphaneChazelasの回答 に加えて、-iコマンドラインオプションを使用すれば、この問題を心配する必要はありません。

$ Perl -pe '' 'uname|'
Linux

$ Perl -i -pe '' 'uname|'
Can't open uname|: No such file or directory.

-iオプションを使用する場合、Perlstat を使用して、処理する前にファイルのステータスを確認しました。

$ strace -fe trace=stat Perl -pe '' 'uname|'
stat("/home/cuonglm/Perl5/lib/Perl5/5.20.1/x86_64-linux", 0x7fffd44dff90) = -1 ENOENT (No such file or directory)
stat("/home/cuonglm/Perl5/lib/Perl5/5.20.1", 0x7fffd44dff90) = -1 ENOENT (No such file or directory)
stat("/home/cuonglm/Perl5/lib/Perl5/x86_64-linux", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
Process 6106 attached
Linux
Process 6105 suspended
Process 6105 resumed
Process 6106 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

$ strace -fe trace=stat Perl -i -pe '' 'uname|'
stat("/home/cuonglm/Perl5/lib/Perl5/5.20.1/x86_64-linux", 0x7fffdbaf2e50) = -1 ENOENT (No such file or directory)
stat("/home/cuonglm/Perl5/lib/Perl5/5.20.1", 0x7fffdbaf2e50) = -1 ENOENT (No such file or directory)
stat("/home/cuonglm/Perl5/lib/Perl5/x86_64-linux", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("uname|", 0x785f40)                = -1 ENOENT (No such file or directory)
Can't open uname|: No such file or directory.
9
cuonglm