- # クリップボードの内容を、スカラー変数に取り込む
- # `` バッククォートで囲まれた文字列は、Perl上ではなく、
+# クリップボードの内容を、スカラー変数に取り込む
+# `` バッククォートで囲まれた文字列は、Perl上ではなく、
- # pbpaste は実行すると、クリップボードの内容を表示する
- # (なのでこのプログラムはMacでのみ動く)
+ # pbpaste は実行すると、クリップボードの内容を表示する
+ # (なのでこのプログラムはMacでのみ動く)
- # 実行した後の結果をスカラー変数 $clipbord に代入している
+# 実行した後の結果をスカラー変数 $clipbord に代入している
my $clipbord = `pbpaste`;
# Perlのsystem関数を利用して、OSに()内の
- # 上記の`` バッククォートと違うのは、コマンドの実行結果を
- # 実行結果が欲しい場合には`` バッククォート
- # 実行結果が入らない(実行されれば、それでいい)って場合は
+# 上記の`` バッククォートと違うのは、コマンドの実行結果を
+# 実行結果が欲しい場合には`` バッククォート
+# 実行結果が入らない(実行されれば、それでいい)って場合は
# pbcopyは、クリップボードに文字列を設定するmacOSの
- # echo '$string' | pbcopy
- # はOSに渡される時に$stringの内容が展開されて以下のようになる
- # echo 'SECRET' | pbcopy
+# echo '$string' | pbcopy
+# はOSに渡される時に$stringの内容が展開されて以下のようになる
+# echo 'SECRET' | pbcopy
- # pbcopy はパイプ | で渡されたものをクリップボードに設定する
+# pbcopy はパイプ | で渡されたものをクリップボードに設定する
system("echo '$string' | pbcopy");
- system("echo '$clipbord' | pbcopy");
+ # system("echo '$clipbord' | pbcopy");
+# しかし、もともとクリップボードに貼り付けていた文字列が
+# 以下のようなものだった場合には、クリップボードの内容を
+# 書き戻す時点でOSコマンドインジェクションが発生する
+# ' | touch /tmp/injection | echo 'injection
+# $clipbordの中身を展開するとこのようなコマンドがOSに渡される
+# echo '' | touch /tmp/injection | echo 'injection' | pbcopy
+# touch /tmp/injection # /tmp内にinjectionというファイルが作成される
+# echo 'injection' # injectionという文字を表示する
+# pbcopy # 直前のコマンドの内容をクリップボードに貼り付ける
+# OSコマンドインジェクションを防ぐため、3引数のopenコマンドで
+# http://perldoc.jp/func/open
+ # 出力先をpbcopyコマンドに指定したファイルハンドル$pipeを作成する
+ open my $pipe, '|-', 'pbcopy' or die $!;
+ # $clipbordの中身を、ファイルハンドル$pipeに出力