2017-02-22 9 views
0

Я разработал довольно большое веб-приложение с использованием Tornado 4.2. Один из обработчиков моего приложения отвечает за проверку регистрационных данных пользователя через почтовый запрос.ValueError: Небезопасное значение заголовка

В частности, в этом обработчике я использую подписанные печенья с set_secure_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 post указал мне в правильном направлении. Проблема, Значение ValueError: Небезопасное значение заголовка, я столкнулся с двумя существующими проблемами: 1473 и 1025, которые были решены на версии Tornado 4.3. Вопрос для меня было то, что некоторые имена были большего времени, чем какой-либо другой в результате чего размер заголовка для этих имен пользователей, чтобы быть больше, чем 4000.

Так, чтобы правильно решить эту проблему, вы можете принять одно из двух действий ниже:

  1. Обновите свой «Торнадо» до версии, равной или превышающей 4.3.
  2. Если вы не хотите его обновлять, вы можете увеличить предел размера заголовка до 8000 или более. Вы можете это сделать, изменив файл web.py в установленном дистрибутиве Tornado в вашей системе.

Например в системе Debian путь является:

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

Глядя на corresponding source code дает два варианта:

  1. Существует недопустимый символ в вашей ценности печенья. Это может быть только в имени пользователя, так как метод set_secure_cookie правильно избегает его заданного значения как base64. Пожалуйста, убедитесь, что ваше имя пользователя не содержит invalid characters ([\x00-\x1f]) или - гораздо лучше - используйте безопасное имя файла cookie для имени пользователя.

  2. На мой взгляд, более вероятная причина этого заключается в том, что ваш объект разрешений является большим для размещения его в файле cookie. Tornado ограничивает значения файлов cookie до 4000 (см. source). При использовании безопасного файла cookie есть больше информации, чем ваши данные, которые необходимо вставить, плюс ваши данные кодируются как base64, что делает его еще большим. Хранение такой большой информации, как cookie, может быть не очень хорошей идеей по многим причинам (т. Е. Ее отправкой с каждым запросом ...). Вы должны либо сохранить эту серверную часть данных, либо использовать другую локальную технологию sotrage, чем файлы cookie.

+0

Благодаря @Georg! Поэтому проблема заключается в том, что я не проверял источник для моей установленной версии, но для новейшей версии.Спасибо, что указал мне в правильном направлении, я проголосовал и разместил решение для этого :) – afxentios

Смежные вопросы