Snippets

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

Updated by sironekotoro

File nantoka-maneger.pl Modified

  • Ignore whitespace
  • Hide word diff
 # 改行を削る
 chomp $input;
 
-
 # 一時的にクリップボード上で書き換える文字列
 my $string = "SECRET";
 
-
 # 入力文字列が正しいか、間違っているかを
 # if文の文字列比較で判定
 if ( $input eq $key ) {
 
-    # クリップボードの内容を、スカラー変数に取り込む
-    # `` バッククォートで囲まれた文字列は、Perl上ではなく、
-    # OSで実行されるコマンド。
+# クリップボードの内容を、スカラー変数に取り込む
+# `` バッククォートで囲まれた文字列は、Perl上ではなく、
+# OSで実行されるコマンド。
 
-    # pbpaste は実行すると、クリップボードの内容を表示する
-    # macOSのコマンド
-    # (なのでこのプログラムはMacでのみ動く)
+  # pbpaste は実行すると、クリップボードの内容を表示する
+  # macOSのコマンド
+  # (なのでこのプログラムはMacでのみ動く)
 
-    # 実行した後の結果をスカラー変数 $clipbord に代入している
+# 実行した後の結果をスカラー変数 $clipbord に代入している
     my $clipbord = `pbpaste`;
 
-
     # Perlのsystem関数を利用して、OSに()内の
     # 命令を実行させる
 
-    # 上記の`` バッククォートと違うのは、コマンドの実行結果を
-    # Perlが欲しいかどうか。
-    # 実行結果が欲しい場合には`` バッククォート
-    # 実行結果が入らない(実行されれば、それでいい)って場合は
-    # system関数を利用する
+# 上記の`` バッククォートと違うのは、コマンドの実行結果を
+# Perlが欲しいかどうか。
+# 実行結果が欲しい場合には`` バッククォート
+# 実行結果が入らない(実行されれば、それでいい)って場合は
+# system関数を利用する
 
     # 文字列をクリップボードに設定する
     # 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
+#   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 {
     # 入力した文字列が異なって入ればエラー
Updated by sironekotoro

File nantoka-maneger.pl Modified

  • Ignore whitespace
  • Hide word diff
 # 改行を削る
 chomp $input;
 
+
+# 一時的にクリップボード上で書き換える文字列
+my $string = "SECRET";
+
+
 # 入力文字列が正しいか、間違っているかを
 # if文の文字列比較で判定
 if ( $input eq $key ) {
 
- # クリップボードの内容を、スカラー変数に取り込み
- # `` バッククォートで囲まれたものは、OSのターミナルで
- # 実行するコマンド。
- # 実行した後の結果をスカラー変数$clipbordに代入している
+    # クリップボードの内容を、スカラー変数に取り込む
+    # `` バッククォートで囲まれた文字列は、Perl上ではなく、
+    # OSで実行されるコマンド。
+
+    # pbpaste は実行すると、クリップボードの内容を表示する
+    # macOSのコマンド
+    # (なのでこのプログラムはMacでのみ動く)
+
+    # 実行した後の結果をスカラー変数 $clipbord に代入している
     my $clipbord = `pbpaste`;
 
-    print $clipbord;
 
-    # 一時的にクリップボード上で書き換える文字列
-    my $string = "お疲れ様です";
+    # Perlのsystem関数を利用して、OSに()内の
+    # 命令を実行させる
+
+    # 上記の`` バッククォートと違うのは、コマンドの実行結果を
+    # Perlが欲しいかどうか。
+    # 実行結果が欲しい場合には`` バッククォート
+    # 実行結果が入らない(実行されれば、それでいい)って場合は
+    # system関数を利用する
 
     # 文字列をクリップボードに設定する
-    system("echo $string | pbcopy");
+    # 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";
Created by sironekotoro

File nantoka-maneger.pl Added

  • Ignore whitespace
  • Hide word diff
+#!/usr/bin/env perl
+use strict;
+use warnings;
+
+# mac os用
+# 1.実行時のクリップボードの中身を指定した文字列に書き換え
+# 2.一定時間経過すると、クリップボードの中身を元に戻す
+
+# クリップボードの中身を書き換える時間
+my $time = 10;
+
+# パスフレーズ
+my $key = 'otsu';
+
+# 入力を促すメッセージ
+print "パスフレーズを入力してください > ";
+
+# 標準入力を受け取り
+my $input = <STDIN>;
+
+# 改行を削る
+chomp $input;
+
+# 入力文字列が正しいか、間違っているかを
+# if文の文字列比較で判定
+if ( $input eq $key ) {
+
+ # クリップボードの内容を、スカラー変数に取り込み
+ # `` バッククォートで囲まれたものは、OSのターミナルで
+ # 実行するコマンド。
+ # 実行した後の結果をスカラー変数$clipbordに代入している
+    my $clipbord = `pbpaste`;
+
+    print $clipbord;
+
+    # 一時的にクリップボード上で書き換える文字列
+    my $string = "お疲れ様です";
+
+    # 文字列をクリップボードに設定する
+    system("echo $string | pbcopy");
+
+    # カウントダウン
+    for my $t ( 1 .. $time ) {
+        sleep 1;
+        print $time - $t, "\n";
+    }
+
+    # 指定の秒数待ち終わったら元の文字列を
+    # クリップボードに設定する
+    system("echo '$clipbord' | pbcopy");
+
+}
+else {
+    # 入力した文字列が異なって入ればエラー
+    print "error\n";
+}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.