Snippets

sironekotoro 一定時間だけパスワードをクリップボードに貼り付け、時間が経過すると元の内容に書き戻す君(OSコマンドインジェクション対応)

Created by sironekotoro last modified
#!/usr/bin/env perl
use strict;
use warnings;

# mac os用
# 1.実行時のクリップボードの中身を指定した文字列に書き換え
# 2.一定時間経過すると、クリップボードの中身を元に戻す

# クリップボードの中身を書き換える時間
my $time = 10;

# パスフレーズ
my $key = 'otsu';

# 入力を促すメッセージ
print "パスフレーズを入力してください > ";

# 標準入力を受け取り
my $input = <STDIN>;

# 改行を削る
chomp $input;

# 一時的にクリップボード上で書き換える文字列
my $string = "SECRET";

# 入力文字列が正しいか、間違っているかを
# if文の文字列比較で判定
if ( $input eq $key ) {

# クリップボードの内容を、スカラー変数に取り込む
# `` バッククォートで囲まれた文字列は、Perl上ではなく、
# OSで実行されるコマンド。

  # pbpaste は実行すると、クリップボードの内容を表示する
  # macOSのコマンド
  # (なのでこのプログラムはMacでのみ動く)

# 実行した後の結果をスカラー変数 $clipbord に代入している
    my $clipbord = `pbpaste`;

    # Perlのsystem関数を利用して、OSに()内の
    # 命令を実行させる

# 上記の`` バッククォートと違うのは、コマンドの実行結果を
# Perlが欲しいかどうか。
# 実行結果が欲しい場合には`` バッククォート
# 実行結果が入らない(実行されれば、それでいい)って場合は
# system関数を利用する

    # 文字列をクリップボードに設定する
    # pbcopyは、クリップボードに文字列を設定するmacOSの
    # コマンド。

# echo '$string' | pbcopy
# はOSに渡される時に$stringの内容が展開されて以下のようになる
# echo 'SECRET' | pbcopy

# pbcopy はパイプ | で渡されたものをクリップボードに設定する
    system("echo '$string' | pbcopy");

    # カウントダウン表示
    # 後何秒で元に戻るか気になったので入れた
    # 趣味
    for my $t ( 1 .. $time ) {
        sleep 1;
        print $time - $t, "\n";
    }

    # 指定の秒数待ち終わったら元の文字列を
    # クリップボードに設定する
    # system("echo '$clipbord' | pbcopy");

# しかし、もともとクリップボードに貼り付けていた文字列が
# 以下のようなものだった場合には、クリップボードの内容を
# 書き戻す時点でOSコマンドインジェクションが発生する
# ' | touch /tmp/injection | echo 'injection

# $clipbordの中身を展開するとこのようなコマンドがOSに渡される
# echo '' | touch /tmp/injection | echo 'injection' | pbcopy
#   echo '' # 空文字列を表示
#   touch /tmp/injection    # /tmp内にinjectionというファイルが作成される
#   echo 'injection'    # injectionという文字を表示する
#   pbcopy # 直前のコマンドの内容をクリップボードに貼り付ける

# OSコマンドインジェクションを防ぐため、3引数のopenコマンドで
# 2番目の引数に |- を利用する
# http://perldoc.jp/func/open

    # 出力先をpbcopyコマンドに指定したファイルハンドル$pipeを作成する
    open my $pipe, '|-', 'pbcopy' or die $!;
    # $clipbordの中身を、ファイルハンドル$pipeに出力
    print $pipe $clipbord;
    # ファイルハンドルを閉じる
    close $pipe;
}
else {
    # 入力した文字列が異なって入ればエラー
    print "error\n";
}

Comments (0)