
Yes
04.10.2018
05:49:52
посоветуйте как оптимизировать следующую задачу:
в базу делается запрос , ответ надо записать в csv файл. пользуюсь библиотекой csv.
итоговый размер файла примерно 3 GB + .
На данный момент циклом пробегаюсь по листу и записываю каждую строчку csvwriter.writerow(item)
после цикла закрываю файл
csvfile.close()

Василий
04.10.2018
05:52:43

Nikolay
04.10.2018
05:53:59
Потом спасибо скажешь

Google

Василий
04.10.2018
05:55:07
И еще csv файлы отлично пережимаются через gzip -9

Nikolay
04.10.2018
05:58:27

Sergey
04.10.2018
05:59:50
или утилита
хз как обозвать

Aragaer
04.10.2018
06:07:06
ты где ее надыбал
Купил в японии на амазоне. В смысле физически был в японии и заказал на амазоне с доставкой в ближайший супермаркет.

Nikolay
04.10.2018
06:08:41

Aragaer
04.10.2018
06:09:18
у меня он есть

Nikolay
04.10.2018
06:10:54
О! Глюк какой-то на моей стороне

Xorry
04.10.2018
06:23:58
Привет! Я изучаю вопрос безопасности передачи строковых шаблонов форматирования ("".format()).
Можете, пожалуйста, показать вариант эксплуатации с выводом значения глобальной переменной?

Олег
04.10.2018
06:27:54
Ты тут дольше ответа будешь ждать чем сам в доках найдешь

Google

Xorry
04.10.2018
06:28:57
Я уже погуглил(интересует v3.6.6) и ничего существенного не нашёл

Олег
04.10.2018
06:29:32

Alex
04.10.2018
06:29:35

Sergey
04.10.2018
06:31:36

Олег
04.10.2018
06:32:02

Aragaer
04.10.2018
06:32:12
/me - вредный, может просто прийти и спросить что-то такое, что гуглить дольше, чем ответить. Как вчера про datetime

Xorry
04.10.2018
06:33:05
Меня вариант со строками интересовал, но тут надо финты ушами сделать что бы object поискать)

Aragaer
04.10.2018
06:33:20
в 3.6 наверно можно через f-строки как-то схулиганить

Nikolay
04.10.2018
06:33:24
/kekme

Alex
04.10.2018
06:33:27
гхм.... я немного не согласен, да этот вопрос таки гуглится, но он точно не описан явно в документации. поэтому в сей раз я встану на защиту новичка.
а форматированная строка может прийти из небезопасного источника

Aragaer
04.10.2018
06:33:55
ок
а, то есть предполагается, что кто-то сконструячил что-то хитрое, а мы ему вызываем .format

Xorry
04.10.2018
06:34:48
Угу, оно самое

Alex
04.10.2018
06:34:56

Aragaer
04.10.2018
06:35:03
https://www.python.org/dev/peps/pep-3101/
в документации ссылка на этот пеп
я не вижу там чего-то страшного, но может быть можно как-то добраться до кишков того словаря, который передается в format

Google

Aragaer
04.10.2018
06:36:46
и через него выбраться наружу

Alex
04.10.2018
06:37:03

Aragaer
04.10.2018
06:37:31
собственно в том же си printf уязвим через отсутствие проверки _числа_ аргументов, что позволяет нахватать аргументов со стека

Alex
04.10.2018
06:37:32

Aragaer
04.10.2018
06:38:10
вот, да, я про это

Sergey
04.10.2018
06:38:20

Aragaer
04.10.2018
06:38:21
то есть из форматной строки в питоне доступ только до того, что в нее передано

Xorry
04.10.2018
06:40:02
а от чего обезопаситься?
Просто хочу закрепить на практике. А так обезопаситься от пользовательского ввода можно через string.Template

Alex
04.10.2018
06:40:09

Nikolay
04.10.2018
06:41:11
Присылайте ваши приватные ключи

Aragaer
04.10.2018
06:41:31
>>> class X:
... def p(self):
... print("hello, world")
...
>>> "{0.p}".format(X())
'<bound method X.p of <__main__.X object at 0x7f022646b588>>'
>>> "{0.p()}".format(X())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'p()'
до полей добраться можно, но ни один метод вызвать нельзя

Xorry
04.10.2018
06:42:01
__globals__ бы какой-то дёргнуть

Aragaer
04.10.2018
06:42:15
по-моему все внутренние поля закрыты
__dict__ пустой
а, не, __doc__ нормально отдается
что-то отдается, что-то нет

Alex
04.10.2018
06:44:58
Python 3.7.0 (default, Sep 18 2018, 18:47:22)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
>>> SECRET = 'secret_key'
>>> class X:
... def __init__(self):
... pass
...
>>> x = X()
>>> '{0.__init__.__globals__[SECRET]}'.format(x)
'secret_key'

Aragaer
04.10.2018
06:46:03
>>> class X:
... "test"
... def p(self):
... print("hello, world")
...
>>> "{0.__class__.__dict__}".format(X())
"{'__module__': '__main__', '__doc__': 'test', 'p': <function X.p at 0x7f022645fb70>, '__dict__': <attribute '__dict__' of 'X' objects>, '__weakref__': <attribute '__weakref__' of 'X' objects>}"

Google

Sergey
04.10.2018
06:46:52
а зачем пользовательский ввод в формат засовывать вообще?

Aragaer
04.10.2018
06:47:01
у меня не отдает

Xorry
04.10.2018
06:47:10

Alex
04.10.2018
06:47:12

Aragaer
04.10.2018
06:47:17
>>> "{0.__init__.__globals__['_SECRET']}".format(X())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'method-wrapper' object has no attribute '__globals__'
а, надо метод init

Alex
04.10.2018
06:47:40

Aragaer
04.10.2018
06:48:25
>>> "{0.p.__globals__}".format(X())
"{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'X': <class '__main__.X'>, '_SECRET': 'XXX'}"
>>> "{0.p.__globals__['_SECRET']}".format(X())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: "'_SECRET'"

Alex
04.10.2018
06:48:35
ну т.е. это весьма полезно знать, что str.format небезопасен

Aragaer
04.10.2018
06:48:37
интересно - если словарь целиком печатать, ключ есть. Если явно ключ - нету

Alex
04.10.2018
06:48:51

?
04.10.2018
06:48:56
@deluxoft от моего сервака, есле найдешь?

Aragaer
04.10.2018
06:49:09
а, ок
>>> "{0.p.__globals__[subprocess].Popen}".format(X())
"<class 'subprocess.Popen'>"
вайкрастота

Sergey
04.10.2018
06:50:18

Xorry
04.10.2018
06:50:46
Проще урезаную форматилку прикрутить. Ну через строку походу нельзя вылезти

Alex
04.10.2018
06:50:50
более того в той статье Армина, что я скинул в самом начале описана возможная реализация безопасных строковых шаблонов

Google

Sergey
04.10.2018
06:53:05

Alex
04.10.2018
06:53:06
никакой "валидации" вкорячивать не нужно, да и я слабо представляю как ты будешь ее делать.

Aragaer
04.10.2018
06:53:08
mustache

Alex
04.10.2018
06:53:41

Sergey
04.10.2018
06:54:50

Alex
04.10.2018
06:55:38
кстати mako небезопасен, а в jinja2 эта проблема была явно решена

Philipp
04.10.2018
08:10:26
Ребят, а где почитать про нюансы использования тех или иных "конструкций"?
Например, что лучше использовать - list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) или [x for x in [3, 4, 5, 6, 7] if x > 5] и в каких случаях?

Maxim robox
04.10.2018
08:11:09
Ребят, а где почитать про нюансы использования тех или иных "конструкций"?
Например, что лучше использовать - list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) или [x for x in [3, 4, 5, 6, 7] if x > 5] и в каких случаях?
Ну конкретно здесь лучше первое.