Форум сайта python.su
0
Помню, где-то видел способ интерпретировать строку как код.
И вот как раз у меня есть строка, которую неплохо бы интепретировать, потому что представляет она собой словарь со списками со словарями, из которых мне нужно извлечь кучу нужных данных.
Напомните?
Офлайн
0
Закрывайте тред, нашёл ответ на этом же форуме в разделе “Для экспертов”
Ответ - функция eval(string)
Офлайн
857
BearProЭто json и модуль для этого - json. А использование eval() - практически всегда признак непрофессионализма, так как 1) он создаёт серьёзные проблемы 2) без него всегда можно обойтись, заменив.
И вот как раз у меня есть строка, которую неплохо бы интепретировать, потому что представляет она собой словарь со списками со словарями, из которых мне нужно извлечь кучу нужных данных.
Отредактировано py.user.next (Дек. 9, 2016 02:19:15)
Офлайн
61
py.user.next
А какие проблемы от него можно ожидать? Я им не пользуюсь но что бы не наступать на грабле?
Офлайн
15
ZerGНу, к примеру, твое веб-приложение принимает json, который парсится функцией eval. В таком случае стороннее лицо может передать любой питоновский код вместо json который, например, сделает копию базы и отправит ему на почту.
py.user.nextА какие проблемы от него можно ожидать? Я им не пользуюсь но что бы не наступать на грабле?
Офлайн
61
А если к примеру я своем веб приложении проверяю данные которые ко мне пришли и если это не список/словаь И так далее - посылаю нафик?
Офлайн
857
ZerGВот здесь описание примеров
А какие проблемы от него можно ожидать?
>>> eval('[1, 2, [__import__("os").system("ls -l /etc/passwd")]]') -rw-r--r--. 1 root root 2381 окт 3 00:13 /etc/passwd [1, 2, [0]] >>>
Отредактировано py.user.next (Дек. 9, 2016 08:35:20)
Офлайн
568
А этот json не распарсится
import json d = '[1, 2, [__import__("os").system("ls -l /etc/passwd")]]' print(json.loads(d))
Traceback (most recent call last):
File “/Users/asmirnov/PycharmProjects/test/test.py”, line 3, in <module>
print(json.loads(d))
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py”, line 319, in loads
return _default_decoder.decode(s)
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py”, line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py”, line 357, in raw_decode
raise JSONDecodeError(“Expecting value”, s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 9 (char 8)
Офлайн
568
В json могут быть только строки и числа (ну и всякие null), и можно сколько угодно пытаться выполнить строку
Офлайн
61
FishHook
Я как раз это и говорил! У меня как раз крутится решение подобное! Ивалов нет. Но было интересно.
Офлайн