pub
サブフォルダーとファイルを含むパブリック フォルダーがあります。ユーザーから相対ファイルパスが渡され、いくつかのマッピングを実行し、ファイルを読み取ってfstream
ユーザーに返します。
問題は、ユーザーが../fileXY.txt
パストラバーサルやその他のタイプのファイルパスインジェクションを考慮して、たとえば、またはその他の派手なもののようなパスを提供した場合です。fstream
それを受け入れて、私のパブリックpub
フォルダーの外にある可能性のあるファイルを読み取るか、さらに悪いことに、システム上のすべてのファイルのリストを提供します... .
車輪を再発明する前に、ファイルシステム ライブラリを検索したところ、このstd::filesystem::canonical関数があり、通常の形式についてかなりの話があることがわかりました。ここで一般的な質問があります。この関数とバリアントstd::filesystem::weakly_canonicalを使用して、この種の脆弱性を防ぐことはできますか? では、基本的には十分でしょうか?
さらに、私のシステムのファイルシステム ライブラリはまだ実験モードであり、std::filesystem::weakly_canonical
がありません。しかしcanonical
、ファイルは に存在する必要があるため、を使用できませんcanonical
。私の場合、特定のマッピングがあり、その意味でファイルは存在しません。したがって、weakly_canonical
関数を模倣する必要がありますが、どうすればよいでしょうか?
存在しないパスのリアルパスに関する関連するスタックオーバーフローの質問を見たことがあります。パスが存在する限り正規を繰り返してから、存在しない部分を追加するように提案されましたが、これもこれらのタイプのインジェクションに対して脆弱です。それで、自分でロールバックする必要がありますか、それともいくつかの機能weakly_canonical
を組み合わせて何とか模倣できますか?std::experimental::filesystem