私はフォームが投稿されたときにFlaskアプリケーションに文字列を送信するフォームを持っています。文字列はファイルパスなので、../../../etc/passwd
のような厄介なものは含まれていないことを確認したいと思います。 Flaskが使用するWerkzeugには、secure_filename
と呼ばれる便利な機能があり、ファイル名から厄介なものを取り除きます。残念ながら、templates/example.html
のようなフルパスを入力すると、/
が_
に変換されるので、最終的にはtemplates_example.html
になります。Webアプリケーション(Flask、この場合)に任意の深いパスを安全に渡す方法はありますか?
パスをレベルに分割することは賢明だと思うので、templates
とexample.html
を別々に送信してから、再びサーバーに参加させてください。これは、パスが任意に深いことができることを除いて、素晴らしいです。私はちょうど一緒にdir1/dir2/dir3/dir4
を紐で結ぶことができ、誰もがdir4
より深くなることを願っていませんが、それはダムのようです。
深さが不明なパスの検証を処理する正しい方法は何ですか?異なる検証をしますか?データを別に送信しますか?パスを別々に符号化し、サーバー上でデコードしますか?
あなたがそうのような任意のパスを処理するために werkzeug.routing.PathConverterを使用することができます
あなたのブラウザはパスを解決しています。それ自体では、パスコンバータはパスをサニタイズしません。その問題の適切な解決方法については、私の答えを参照してください。 –
私はArminに同意します。ファイルパスを確保するために ''に依存するだけでは不十分で、大きなセキュリティホールです。 –