2017-02-22 12 views
0

私はTornado 4.2を使用して非常に大きなWebアプリケーションを開発しました。私のアプリケーションのハンドラの1つは、投稿リクエストを通じてユーザのログイン詳細を確認する責任があります。ValueError:安全でないヘッダー値

具体的に、このハンドラで、私は以下のコード使用して、ユーザーとその権限でログインして識別するためにset_secure_cookieで署名クッキーを使用します。別のユーザーに送信するために、私はトルネードのredirectを使用するクッキーを設定した後

self.set_cookie("user", self.get_argument("username"), domain=".my-domain.com", expires_days=None, httpOnly=True) 
self.set_secure_cookie("access", str(data['permissions']), expires_days=None, httpOnly=True) 

をURL。

ほとんどの場合、問題なく正常に動作します。しかし、一部のユーザーにとって私は以下のエラーを受け取ります。

 self.redirect("/"+lang+"/base_fx.html") 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 671, in redirect 
     self.finish() 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 934, in finish 
     self.flush(include_footers=True) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 884, in flush 
     self.add_header("Set-Cookie", cookie.OutputString(None)) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 339, in add_header 
     self._headers.add(name, self._convert_header_value(value)) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 369, in 
    _convert_header_value 
     raise ValueError("Unsafe header value %r", value) 
ValueError: ('Unsafe header value %r', 'access="2|1:0|10:1485161516|6:access|3892:eydvd…<long string>..f0a2f8ad"; httponly; Path=/') 
ERROR:tornado.general:Cannot send error response after headers written 

誰もが同様の問題を抱えていますか? corresponding source codeを見ると

答えて

0

ゲオルグジョンポストは私に正しい方向を指摘しました。 ValueError:安全でないヘッダーの値は、現在発生している2つの問題:14731025に関連しています。これは現在、4.3バージョンのTornadoで解決されています。

    :私にとっての問題は、一部のユーザー名は、これらのユーザ名は、だから、適切にあなたが下の2つのアクションのいずれかを取ることができ、この問題を解決するために4000

    よりも大きくなるようにするためのいくつかの他の結果のヘッダーサイズよりも長大たことでした

  1. あなたの竜巻を4.3以上のバージョンに更新してください。
  2. また、アップグレードしたくない場合は、ヘッダーサイズの制限を8000以上に増やすことができます。あなたのシステムにインストールされているTornadoのディストリビューションのファイルweb.pyを変更することで、これを行うことができます。 Debianシステム上の
  3. 例えば

パスは次のとおりです。

usr/lib/python3.2/dist-packages/tornado/web.py 
1

には二つの選択肢があります:あなたのクッキーの値に無効な文字が

  1. があります。 set_secure_cookieメソッドは、指定された値をbase64として正しくエスケープするため、これはユーザー名にのみ存在する可能性があります。ユーザー名にinvalid characters[\x00-\x1f])が含まれていないことを確認してください。そうでない場合は、ユーザー名にも安全なCookieを使用してください。

  2. 私の意見では、これが起こる可能性が高いのは、あなたのアクセス許可オブジェクトがクッキーに入れるために大きいということです。トルネードはクッキー値を4000の長さに制限します(source参照)。安全なクッキーを使用する場合は、あなたのデータに収まる必要があるデータよりも多くの情報があり、データがbase64としてエンコードされているため、さらに大きくなります。このような大きな情報をクッキーとして保存することは、さまざまな理由(つまり、リクエストごとに送信するなど)ではあまり効果的ではないかもしれません。そのデータをサーバー側に保存するか、Cookie以外の別のローカルソート技術を使用する必要があります。

+0

おかげ@Georg!だから問題は、インストールされたバージョンのソースをチェックしていないのですが、最新のものです。私に正しい方向を指摘してくれてありがとう、私はアップ投票し、この解決策を投稿しました:) – afxentios

関連する問題