0

Perlのバイナリファイルでbinmodeを使用したい。では、手元のファイルがバイナリまたはテキストであることをどのように知ることができますか?

つまり、最初に完全なファイルを読み取って、それがバイナリであるかテキストであるかを確認し、次に、バイナリである場合はbinmodeを設定してFPを巻き戻します。

Perl -B / -Tはテキストの最初のブロックのみをチェックするため、通常はpdfをテキストファイルとして分類します(ソースコードは.gif、.pdfなどの拡張子に隠れている可能性があります)。したがって、完全なファイルデータを読み取って、バイナリファイルかテキストファイルかを判断する必要があります。

ソースコードファイル(.pl、.c、.phpなど)には、0x0-0x1fや0xff以降のような非表示の文字は含まれないと聞きました。

すべてのバイトがこの範囲内にあるかどうかをチェックして、それがソースコードファイルであるかどうかを宣言できますか?

4

3 に答える 3

2

セキュリティに偏執的である場合は、実行可能ファイルをデータから分離するようにしてください。binmodeこれには役立ちません。DOSおよび子孫の行末の恐怖を克服するために使用でき、透過的なエンコーディングを指定するために使用できます。

あなたの懸念のために、ユーザーがアップロードしたすべてのファイル敵対的です。「安全な」フォーマットはないので、「バイナリ」を「テキスト」ファイルから分離することは無意味です。単純なヒューリスティックを信頼しないでください。(例えば、Perlは変数名の制御文字を許可します!)

ユーザーデータを処理する場合、Perlにはいくつかの重要な部分があり、チェックされていない入力が届かないようにする必要があります。

  1. 正規表現-任意のコードは。を介して実行できます(?{}) and (??{})
  2. system、、、バックexecティックqx()-自明
  3. eval—変数を補間するときは注意してください。
  4. その他の興味深い点は、、、およびCっぽい文字列関数へのopen引数です。glob

binmodeこれらの中にはありません。

ユーザー指定のデータを提供する必要がある場合は、未処理のデータを渡してみてください。たとえば、phpが解釈しないディレクトリに属する​​ユーザー定義のスタイルシートの場合。画像の場合は、受け取ったファイルを変換して、同等の、しかしおそらく安全なバリアントを保存することができます。

于 2012-10-10T16:37:23.967 に答える
2

テキストファイルの場合、本当にテキストモードでファイルを読み取る必要がありますか?binmode無条件でご利用いただけます。

テキストファイルを処理するコードがある場合は、余分なキャリッジリターン(0D)を除外できます。そのようなコードがない場合は、キャリッジリターンが残っているかどうかは問題ではありません。

于 2012-10-11T06:18:01.440 に答える
1

問題は、最新のPOSIXシステムでは、バイナリファイルとテキストファイルの間に違いがないことです。バイトはバイトですバイトはバイトです。

私はむしろ別のアプローチを試みたいと思います。fileLinux / Unixを使用している場合は、 「魔法」を使用してファイルの最初のバイト(または場合によってはさらに)を調べてそのタイプを判別するユーティリティを直接利用できます。Windowsでは、最初にインストールする必要があります。このユーティリティを使用すると、実行可能ファイルやzipファイルなどを比較的簡単にキャッチできます。

Perlでは、モジュールFile::Typeを介して使用できます。

于 2012-10-10T16:12:59.033 に答える