3

C++ でプログラムを作成し、system() 関数からシステム コマンドを発行したいのですが、(コマンドに pwd が含まれているため) 実行可能ウィンドウにコマンドを表示したくありません。サーバーへのユーザー アクセスを許可したり、pwd を表示したりせずに、ユーザーのディレクトリからサーバーにファイルをコピーする必要があります。これを実行する .exe を用意するのが最も簡単な方法です。

元:

system("FILETRANSFER_SW.exe -pw helloWORLD11!@ C:/temp.txt F:/tempfolder/")

しかし、実行可能ウィンドウにはこのコマンドが表示されているため、パスワードを隠そうとする目的が無効になります。

プログラムの最初に system("@echo OFF") を発行しようとしましたが、次のコマンドが抑制されず、実行可能ウィンドウに表示されます。

助言がありますか?

ありがとう...

4

4 に答える 4

8

実行中のプロセスのコマンド ラインは、ほとんどのオペレーティング システムで公開情報と見なされます。

したがって、コマンド ラインでパスワードを渡すことは非常に悪い考えです。

この問題には 2 つの一般的な回避策があり、どちらも呼び出される実行可能ファイルのサポートを必要とします。

  • コマンドラインでユーザー名/パスワードを渡す代わりに、ユーザー名/パスワードを含むファイルの名前を渡します
  • 呼び出された実行可能ファイル内から実行中のプロセスのコマンドラインを再設定します。

最初の解決策は簡単で普遍的に可能ですが、2 番目の解決策には競合状態があり、実装が困難です。クロスプラットフォームの方法がないためです (一部の OS では、argv の変更が役立ちます)。

于 2009-02-25T15:01:52.873 に答える
2

コマンドラインから、Windowsを使用していると想定しています。移植可能にする必要がない場合は、 system() を呼び出す代わりにCreateProcess() API を使用することをお勧めします。

CreateProcess() API はコマンドラインを取ることができ、STARTUP_INFORMATION パラメータを設定して新しいプロセス ウィンドウを非表示にすることができます (wShowWindow = SW_HIDE)。

コマンドラインはカジュアルなユーザーには隠されますが、他の人が指摘しているように、取得するのはそれほど難しくありません. 新しいプロセスを作成しているので、機密データをそのプロセスの標準入力に書き込むことをお勧めします。そうすれば、プロセスはそれを読み取って正常に処理できます。

于 2009-02-25T15:08:13.467 に答える
0

別の解決策は、プログラム間でパスワードを送信し、3DES や AES などで暗号化することです。

パイプを使用して両方のプログラム間で通信することができ、コマンド ラインはまったく使用しません。

しかし、このスキームはどれも実際には安全ではなく、かなり簡単に回避できます。セキュリティを強化したい場合は、サーバーである種のチャレンジ/レスポンス プロトコルを使用する必要があります。

于 2009-02-25T23:59:52.177 に答える
0

CreateProcess() API を使用すると機密データがユーザーから隠されますが、パワー ユーザーは Process Explorer などの無料のユーティリティを使用して、プロセスに関連付けられたコマンド ラインを簡単に取得できます。

于 2009-02-25T15:11:46.627 に答える