私は、サーバーが変数を置き換える文字列をユーザーが提供できるWebアプリに取り組んでいます。
できれば、 PEP 3101 構文を使用したいと思います。信頼できない入力に対して安全にするために、format()
メソッドをオーバーライドする可能性を検討しています。Formatter
現状で私が見ることができるリスクは次の.format()
とおりです。
- パディングを使用すると、任意の長さを指定
'{:>9999999999}'.format(..)
できるため、サーバーがメモリ不足になり、DOSになる可能性があります。これを無効にする必要があります。 - Formatを使用すると、オブジェクト内のフィールドにアクセスできます。これは便利ですが、dunder変数にアクセスして、標準ライブラリのビットへのドリルを開始できるのは不気味です。
getattr()
副作用があるか、何か秘密を返す可能性がある場所はわかりません。をオーバーライドして、属性/インデックスアクセスをホワイトリストに登録しますget_field()
。 - 当然、いくつかの例外をキャッチする必要があります。
私の仮定は次のとおりです。
- パラメータの指定は、スレッドのスタックから直接ポップするのではなく、コレクションへの境界チェックされたアクセスであるため、従来のC形式の文字列エクスプロイトはいずれもPythonには適用されません。
- 私が使用しているWebフレームワークは、ページテンプレートに置き換えられたすべての変数をエスケープします。出力前の最後の停止である限り、エスケープ解除から発生するクロスサイトスクリプティング攻撃から安全です。
あなたの考えは何ですか?可能?不可能?単に賢明ではありませんか?
編集:Armin Ronacherは、dunder変数アクセスを除外しない場合の厄介な情報漏えいについて概説していますが、セキュリティ保護format()
は実行可能であると見なしているようです。
{local_foo.__init__.__globals__[secret_global]}
Pythonの新しいスタイルの文字列形式に注意してください| アーミン・ロンチャーの考えと著作
個人的には、私は実際にformat()
私の製品で信頼できないルートをたどりませんでしたが、完全を期すために更新しています