2011-08-11 6 views
3

私は、キー名の一部としてWeb形式でユーザによって入力された文字列を使用したいと思います:安全なユーザー入力をkey_nameとして使用しますか?

user_input = self.request.POST.get('foo') 
if user_input: 
    foo = db.get_or_insert(db.Key('Foo', user_input[:100], parent=my_parent)) 

は、この安全ですか?または、安価なエンコードやハッシュを行う必要がありますか?はいの場合はどちらですか?

+0

self.request.POST ['foo']が存在しない場合は例外が発生します –

+0

私はこの例を省略したいと思います。もちろん、私はエンコーディング、長さチェック、その他の検証を含む、実際のコードとは違ったやり方をしています。問題は、入力文字列をキーとして使用することに焦点を当てています。 – zengabor

答えて

3

データベースを迷惑メールでいっぱいにする悪意のあるユーザーが気にしない限り、安全です。 get_or_insertは既存のエントリを上書きすることはできません。新しいエントリを追加するだけです。

他の検証をしなくても、UIの長さと受信後の長さを制限するようにしてください。少なくとも、巨大なキーを埋めてデータベースをすばやく削除するか、アプリをクラッシュさせます。

編集:実際には、それが合理的なキーであることを確認したばかりです。その場合、はい、安全です。

ユーザーは、データベースに既に存在するキーが、提供されたものに応答するのに要する時間に基づいている可能性がありますが、依然として許可されていることを確認する必要があります彼らが要求している内容を見たり、少数のリクエストに制限したりするだけで、生成しているキーにリンクされているすべての情報を取得することはできません。

+0

詳細な回答ありがとうございました!私は上記のすべてを考慮する。 – zengabor

+0

また、すべてのキー名が有効であるとは限りません。長さの制限とは別に、 '__'で始まりそして終わるキー名は予約されています - 例えば' __key__'。 –

関連する問題