0

私はperlで自動化スクリプトを開発しています。認証のために、ユーザーが入力したパスワードを受け取り、それをメインのperlプログラムに返し、自動化する必要があるツールにパスワードを渡すサブルーチンを作成しました。

このスクリプトは、文字#がパスワードの一部でない限り、すべてのケースで問題なく動作します。その後、ツールを自動化できず、認証に失敗します。

以下は、パスワード入力に使用したサブルーチンです。

use Win32::Console;

sub password() {
    $StdIn = new Win32::Console(STD_INPUT_HANDLE);
    my $Password = "";

    $StdIn->Mode(ENABLE_PROCESSED_INPUT);
    print "Enter Password: ";

    while (ord(my $Data = $StdIn->InputChar(1)) != 10) { 
        if("\r" eq $Data ) {
            last;
        }
        elsif ("\ch" eq $Data) {
            if( "" ne chop( $Password )) {
                print "\ch \ch";
            }
            next;
        }
        $Password .=$Data;
        print "*";
    }
    return $Password;
}

上記のサブルーチンを次のように呼び出しています

$passwd = &password();

そして、 $passwd以下のように自動化する必要があるツールに を渡します。

これは、ツールにパスワードを渡す行です。

cc -c URL OF THE TOOL:$server -d $domain -t $appl -u $userid -p $passwd; \n"; 

password() サブルーチンを呼び出し、$password を返し、$passwd をツールに渡すコードをクロスチェックしてください。エラーは 3 つの場所のいずれかにあると思います。誰か助けてください。可能であればコードも提供してください。

4

2 に答える 2

1

シェル側での引用の問題のように思えます。適切な引用規則は、システムのコマンド シェルに完全に依存しています。たとえば、bash では、Perl スクリプトで に-p '$password'音訳'しているときに、 のようなものを使用することでかなり安全になることがよくあります。\'または、そのためのモジュールがある可能性がありますが、私は知りません。

ただし、データを渡すのは「cc」です。このツールは、パスワードを安全に渡すためのより簡単な方法をサポートできます。つまり、任意のデータを引用する必要がなくなります。このような機能の例としては、STDIN 経由、外部ファイル経由 (実際にはかなり安全ではない可能性があります :))、または null で終わる文字列があります。またはハッシュのみを渡します。だから私はドキュメントを調べます。

ユーザーが収集したデータをシェルに渡すと、大きなセキュリティ リスクが生じることに注意してください。Perl のTaint modeの使用を検討してください。

更新: あなたはそれが Windows だと言っているので、警告しておく必要があります: cmd.exe の引用は、私がこれまでに行った中で最も複雑で、苦痛で、苛立たしいことの 1 つです。この質問を見てください

于 2012-05-07T09:43:54.727 に答える
1

#おそらく、「コメントの開始」として解釈されるため、リテラルをサポートしていない何らかの外部ツールにユーザー入力を渡している可能性があります。シェルが疑わしい可能性があります。ただし、サンプル コードがなければ、問題の原因を特定することはできません。

于 2012-05-07T06:57:12.430 に答える