6

プログラムで使用している静的ライブラリがあります。このライブラリは、実際のファイルの内容ではなく、ファイル名のみを入力として受け取ることができます。ライブラリのソースコードについて私にできることは何もありません。だから私はしたい:真新しいファイルを作成し、それに処理されるデータを保存し、それをディスク(?)にフラッシュし、その名前をライブラリに渡し、そしてそれを削除する。

しかし、私はこのプロセスをかなり安全にしたいとも思って
います。1)偽のデータを使用せずに、ファイルを新しく作成する必要があります(重要ではないかもしれませんが、何でも)。
2)私のプロセス以外の人は、このファイルとの間で読み取りまたは書き込みができないようにする必要があります(一部の賢者がプラグインした偽のデータではなく、ライブラリに実際のデータを処理させたい)
3)このファイルを使い終わったら、削除する必要があります(誰かがTerminateProcess()私なら、できることはほとんどないと思いますが、それでも)。

ライブラリは指定されたファイルを開くために非Unicodeを使用fopen()しているようですが、プログラムはWindowsで実行することを目的としているため、これらすべてを処理する方法がよくわかりません。助言がありますか?

4

6 に答える 6

4

すでにたくさんの提案がありますが、私が言及されていないと思う別のオプションは、名前付きパイプを使用することです。それが機能するかどうかは問題のライブラリに依存しますが、試してみる価値があるかもしれません。関数を使用してアプリケーションで名前付きパイプを作成し、パイプCreateNamedPipeの名前をライブラリに渡して操作することができます(渡すファイル名は\\。\ pipe \ PipeNameになります)。ライブラリがそのようなファイル名を受け入れるかどうかは試してみる必要がありますが、それが機能する場合は、ファイルを実際にディスクに書き込む必要がないという利点があります。

于 2013-01-09T09:40:45.723 に答える
2

これは、CreateFileandGetTempFileName関数を使用して実現できます(現在の作業ディレクトリに書き込めるかどうかわからない場合は、、を使用することもできますGetTempPath)。

  1. 一時ファイルを保存するディレクトリを決定します。現在のディレクトリ( "。")またはの結果GetTempPathが適切な候補になります。
  2. GetTempFileName一時ファイル名を作成するために使用します。
  3. 最後に、を呼び出しCreateFileて一時ファイルを作成します。

最後のステップとして、考慮すべきことがいくつかあります。

  • dwFlagsAndAttributesパラメータにCreateFileはおそらくが含まれているはずFILE_ATTRIBUTE_TEMPORARYです。
  • パラメータには、ファイルが何があっても削除されるようにするための情報も含める必要があります(これは、プロセスがクラッシュした場合にも機能します。この場合、システムはすべてのハンドルを閉じます)dwFlagsAndAttributesFILE_FLAG_DELETE_ON_CLOSE
  • dwShareModeパラメータは、ファイルを開く他の試行が成功するようにするCreateFile必要がありますが、読み取り専用です。これは、ライブラリコードはファイルを読み取ることはできますが、誰もファイルに書き込むことができないことを意味します。FILE_SHARE_READ
于 2013-01-09T08:44:51.203 に答える
2

この記事はあなたに問題に関するいくつかの良いガイドラインを与えるはずです。

問題の要点はこれです:

  • POSIX mkstemp()関数は、利用可能な場合、安全で推奨されるソリューションです。残念ながら、Windowsでは使用できないため、WindowsAPI呼び出しを使用してこの機能を適切に実装するラッパーを見つける必要があります。
  • Windowsでは、tmpfile_s()関数は、一時ファイルを実際にアトミックに開く(単にファイル名を生成するのではなく)唯一の関数であり、競合状態からユーザーを保護します。残念ながら、この関数では、ファイルが作成されるディレクトリを指定できません。これは、潜在的なセキュリティの問題です。
于 2013-01-09T08:55:37.530 に答える
0

主に、ユーザーの一時フォルダー(C:\ Users \\ AppData \ Local \ Tempなど)にファイルを作成できます。このようなファイルに最適な場所です。次に、ファイルを作成するときに、提供するアクセス共有の種類を指定できます。

MSDNのCreateFileヘルプページのフラグメント:

dwShareMode

  • 0他のプロセスが削除、読み取り、または書き込みアクセスを要求した場合に、他のプロセスがファイルまたはデバイスを開かないようにします。
  • FILE_SHARE_DELETEファイルまたはデバイスでの後続のオープン操作を有効にして、削除アクセスを要求します。そうしないと、他のプロセスが削除アクセスを要求した場合にファイルまたはデバイスを開くことができません。このフラグが指定されていないが、ファイルまたはデバイスが削除アクセス用に開かれている場合、関数は失敗します。注:削除アクセスでは、削除操作と名前変更操作の両方が許可されます。
  • FILE_SHARE_READファイルまたはデバイスでの後続のオープン操作を有効にして、読み取りアクセスを要求します。そうしないと、他のプロセスが読み取りアクセスを要求した場合にファイルまたはデバイスを開くことができません。このフラグが指定されていないが、ファイルまたはデバイスが読み取りアクセス用に開かれている場合、関数は失敗します。
  • FILE_SHARE_WRITEファイルまたはデバイスでの後続のオープン操作を有効にして、書き込みアクセスを要求します。そうしないと、他のプロセスが書き込みアクセスを要求した場合にファイルまたはデバイスを開くことができません。このフラグが指定されていないが、ファイルまたはデバイスが書き込みアクセス用に開かれている場合、または書き込みアクセス付きのファイルマッピングがある場合、関数は失敗します。
于 2013-01-09T08:33:03.150 に答える
0

FILE_SHARE_READ、FILE_DELETE_ON_CLOSEの使用など、与えられた提案は良いものですが、これを行うための完全に安全な方法はないと思います。

私はProcessExplorerを使用して、2番目のプロセスの開始を防ぐことを目的としたファイルを閉じました-最初のプロセスがスタックし、「殺せず、死んでいないが、応答していなかった」ため、これを行ったので、これを行う正当な理由がありました-そして、システム上で他のプロセスが実行されているため、その特定の時点でマシンを再起動したくありませんでした。

誰かが何らかのデバッガー(この目的のために特別に作成された非商用のものを含む)を使用し、実行中のプロセスに接続し、ブレークポイントを設定してコードを停止し、開いているファイルを閉じると、ファイルに書き込むことができます作成したばかりです。

あなたはそれを難し​​くすることができますが、十分な特権/スキル/能力を持つ誰かがあなたのプログラムを傍受してデータを操作するのを止めることはできません。

ファイル/フォルダーの保護は、ユーザーがマシン上に特権アカウントを持っていないことを確実に知っている場合にのみ機能することに注意してください-通常のWindowsユーザーはすぐに管理者であるか、管理目的で別のアカウントを持っています-そして私はsudo/rootにアクセスできます私が仕事で使用しているほぼすべてのLinuxボックス-rootアクセス権を持っていない[そしてすべきではない]ファイルサーバーがいくつかあります。しかし、私が自分で使用する、またはテスト目的で借りることができるすべてのボックスは、ルート環境に到達することができます。これはそれほど珍しいことではありません。

私が考えることができる解決策は、別のインターフェイスを使用する別のライブラリを見つけることです[またはライブラリのソースを取得して、それができるように変更します]。これにより、上記のデバッガーアプローチを使用した「停止、変更、実行」攻撃が防止されるわけではありません。

于 2013-01-09T09:03:48.563 に答える
-1

CreateFile APIを使用して、実行可能ファイルのフォルダーにファイルを作成します。ファイルを作成するたびに、ファイル名にUUIDを指定して、他のプロセスがファイル名を推測して開くことができないようにすることができます。その属性をhiddenに設定します。使用後はファイルを削除するだけで十分ですか?

于 2013-01-09T08:23:21.030 に答える