Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 25, 2018 11:38:50

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

Добрый день.
Странный json ответ (или что то не знаю):

 >>>r = requests.get(url, params=data)
>>>r.text
'{} && {"tokenResponse":{"status":{"code":"200","message":""},"data":{"token":"fb34ec6f-37a8-4eb3-bb11-e26587f5fa2d","expiredIn":"25.09.2018 14:32"}}}'
>>> r.json()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/requests/models.py", line 850, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 342, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 4 (char 3)

Прошу подсказать, как быть в данной ситуации???

ps:
 >>> r.headers
{'Cache-Control': 'no-cache, no-store, max-age=0', 'Date': 'Tue, 25 Sep 2018 08:07:13 GMT', 'Content-Type': 'application/json;charset=UTF-8', 'Server': 'Apache-Coyote/1.1', 'Pragma': 'no-cache', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Language': 'en-US', 'Transfer-Encoding': 'chunked'}



Офлайн

#2 Сен. 25, 2018 11:59:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

ivn
'{} && {“tokenResponse”:{“status”:{“code”:“200”,“message”:“”},“data”:{“token”:“fb34ec6f-37a8-4eb3-bb11-e26587f5fa2d”,“expiredIn”:“25.09.2018 14:32”}}}'
И вы думаете что это валидный JSON ? Нет, не валидный.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 25, 2018 12:33:24

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

Я это понимаю, но не пойму зачем в таком виде возвращать? и что делать с этим делом?
Убирать лишнее и пробовать строку перевести в dict? если да, то как например?
Спасибо.

Офлайн

#4 Сен. 25, 2018 13:06:45

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

ivn
но не пойму зачем в таком виде возвращать?
Это делают, чтобы JSON был невалидным в качестве JavaScript кода.
https://groups.google.com/forum/#!topic/firebug/B1zgO5N6Sus

ivn
если да, то как например?
 >>>import json
>>>json.loads(r.text[6:])

Офлайн

#5 Сен. 25, 2018 15:46:41

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

Papa_Svin
Можно как то простыми словами пояснить, что это за атака JSON Hijacking?
Спасибо.

почитал, пока не понял

Офлайн

#6 Сен. 25, 2018 16:17:51

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

ivn
Можно как то простыми словами пояснить, что это за атака JSON Hijacking?
Попробую, допустим, есть какой-то сервис, который отдает некую приватную информацию в виде JSON, например http://myverysecret.com?action=get_all_my_info&format=json
Если ты недавно заходил на сайт http://myverysecret.com, то в браузере в куках останется идентификатор сессии, и повторный заход произойдет уже без авторизации. Теперь, ты заходишь на сайт подлого хакера, на странице которого есть такой кусок кода

 <html>
<head>
<script src="http://myverysecret.com?action=get_all_my_info&format=json"  
  type="text/javascript"></script>
то браузер скачает этот json и засунет его в тег script, тут все законно - json это просто JS объект, а кука с сессией у тебя есть. У тебя просто появится новый объект. Но зловредный негодяй, может другим скриптом прочитать этот объект и отправить его по-тихому на свой сервер. Так вот чтобы json - данные не смогли быть правильно распарсены браузером как JS объект в них вставляют всякие артефакты ломающие синтаксис формата.

Офлайн

#7 Сен. 25, 2018 16:37:54

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

Papa_Svin
Спасибо, стало яснее.
А если хакер в курсах этих артефактов? -)

И еще вопросик не много не по теме.

Я использую requests модуль. Получаю (с помощь логина, пароля, которые указываются в params) токен и время его актуальность в формате JSON.

Как правильно (обычно) с ним работать дальше?
Перед каждым запросом сверять время (на сервер может время отличаться)? Или если при запросе возвращается ошибка (код ошибки что токен уже не актуален) запрашивать заново?
Или в самом модуле есть нужный функционал?

Офлайн

#8 Сен. 25, 2018 16:47:47

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

ivn
А если хакер в курсах этих артефактов? -)
Да сколько угодно, только он не узнает о том, что браузер получил от сервиса, потому что невалидный json вызовет исключение и ничего дальше не случится, код который должен был “перехватить” объект не сработает, да и самого объекта не будет создано в пространстве документа.
Вообще эту дыру пофиксили еще лет семь назад, сейчас не очень актуально.

Офлайн

#9 Сен. 25, 2018 16:52:32

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

ivn
Получаю (с помощь логина, пароля, которые указываются в params) токен и время его актуальность в формате JSON.
Это зависит от того, что за токен. Токен - это просто некий случайный ключ, который подтверждает, что я общаюсь именно с тем ресурсом, которому этот токен передал. Как именно авторизация устроена на стороне сервиса, в каком виде требуется передавать токен в запросе - это проблемы АПИ сервиса. Это наверняка должен быть какой-то хидер, хотя могут его ждать и в теле запроса.

Офлайн

#10 Сен. 25, 2018 21:26:46

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

исключение при использовании метода json() при работе с модулем requests

Papa_Svin
возвращается в теле:

 >>>r = requests.get(url, params=data)
>>>r.text
'{} && {"tokenResponse":{"status":{"code":"200","message":""},"data":{"token":"fb34ec6f-37a8-4eb3-bb11-e26587f5fa2d","expiredIn":"25.09.2018 14:32"}}}'

в документации к API есть вот такие строки:

code 8, Authorization Exception:incorrect token —– Токен просрочен, необходимо получить новый, пройдя
процедуру аутентификации.

пока думается опереться на этот код.
Надо по изучать модуль requests, мб в нём есть что на этот случай, что бы контролировал токен и в случаи необходимости обновлял. Что то типа сессии.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version