Найти - Пользователи
Полная версия: исключение при использовании метода json() при работе с модулем requests
Начало » Python для новичков » исключение при использовании метода json() при работе с модулем requests
1
ivn
Добрый день.
Странный 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'}



JOHN_16
ivn
'{} && {“tokenResponse”:{“status”:{“code”:“200”,“message”:“”},“data”:{“token”:“fb34ec6f-37a8-4eb3-bb11-e26587f5fa2d”,“expiredIn”:“25.09.2018 14:32”}}}'
И вы думаете что это валидный JSON ? Нет, не валидный.
ivn
Я это понимаю, но не пойму зачем в таком виде возвращать? и что делать с этим делом?
Убирать лишнее и пробовать строку перевести в dict? если да, то как например?
Спасибо.
Papa_Svin
ivn
но не пойму зачем в таком виде возвращать?
Это делают, чтобы JSON был невалидным в качестве JavaScript кода.
https://groups.google.com/forum/#!topic/firebug/B1zgO5N6Sus

ivn
если да, то как например?
 >>>import json
>>>json.loads(r.text[6:])
ivn
Papa_Svin
Можно как то простыми словами пояснить, что это за атака JSON Hijacking?
Спасибо.

почитал, пока не понял
Papa_Svin
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 объект в них вставляют всякие артефакты ломающие синтаксис формата.
ivn
Papa_Svin
Спасибо, стало яснее.
А если хакер в курсах этих артефактов? -)

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

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

Как правильно (обычно) с ним работать дальше?
Перед каждым запросом сверять время (на сервер может время отличаться)? Или если при запросе возвращается ошибка (код ошибки что токен уже не актуален) запрашивать заново?
Или в самом модуле есть нужный функционал?
Papa_Svin
ivn
А если хакер в курсах этих артефактов? -)
Да сколько угодно, только он не узнает о том, что браузер получил от сервиса, потому что невалидный json вызовет исключение и ничего дальше не случится, код который должен был “перехватить” объект не сработает, да и самого объекта не будет создано в пространстве документа.
Вообще эту дыру пофиксили еще лет семь назад, сейчас не очень актуально.
Papa_Svin
ivn
Получаю (с помощь логина, пароля, которые указываются в params) токен и время его актуальность в формате JSON.
Это зависит от того, что за токен. Токен - это просто некий случайный ключ, который подтверждает, что я общаюсь именно с тем ресурсом, которому этот токен передал. Как именно авторизация устроена на стороне сервиса, в каком виде требуется передавать токен в запросе - это проблемы АПИ сервиса. Это наверняка должен быть какой-то хидер, хотя могут его ждать и в теле запроса.
ivn
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, мб в нём есть что на этот случай, что бы контролировал токен и в случаи необходимости обновлял. Что то типа сессии.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB