2017-02-22 85 views
0

我開發了一個使用Tornado 4.2的相當大的Web應用程序。我的應用程序的其中一個處理程序負責通過發佈請求驗證用戶的登錄詳細信息。ValueError:不安全的標頭值

set_secure_cookie特別是在此處理我用簽字cookie來識別登錄的用戶及其權限,使用下面的代碼:

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) 

設置我用旋風的redirect餅乾後給用戶發送到另一個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 

有沒有人遇到類似的問題?

回答

0

Georg Jung的帖子指出了我的正確方向。問題,ValueError:不安全的標頭值,我面對的是兩個現有的問題:14731025,現已在4.3版本的Tornado上解決。對我來說,問題是,一些用戶名比其他一些導致頭部大小這些用戶名必須大於4000

因此,要妥善解決這個問題,你可以採取以下兩個動作之一更長:

  1. 將您的龍捲風更新爲等於或大於4.3的版本。
  2. 或者,如果您不想升級它,可以將標題大小的限制增加到8000或更多。您可以通過在系統中安裝的Tornado版本中更改文件web.py來實現。

例如Debian系統上的路徑是:

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

望着corresponding source code給出了兩種選擇:

  1. 。在你的cookie值無效字符。這隻能在用戶名中,因爲set_secure_cookie方法正確地將其賦值爲base64。請確保您的用戶名不包含invalid characters[\x00-\x1f])或更好 - 爲用戶名也使用安全cookie。

  2. 在我看來,這種情況發生的可能性更大的原因是你的權限對象對於把它放入cookie中是很大的。龍捲風將cookie值限制爲4000(請參閱source)。當使用安全的cookie時,您的數據比需要適合的數據更多,而且您的數據編碼爲base64,這使得它更大。存儲諸如cookie這樣的大信息可能不是一個好主意,原因很多(即,它隨每個請求發送,...)。您應該保存數據服務器端或使用不同於cookies的本地存儲技術。

+0

感謝@Georg!所以問題是,我沒有檢查我的安裝版本的來源,但最新的。感謝您指點我正確的方向,我已經投票併發布瞭解決方案:) – afxentios