Безопасность Python 'оценка' для десериализации списка

SQL Server MS 2008 представляет оператор MERGE, которому я верю, является частью стандарта SQL:2003. Поскольку многие показали, это не грандиозное предприятие обработать случаи строки, но при контакте с большими наборами данных, каждому нужен курсор со всеми проблемами производительности, которые приходят. Оператор MERGE будет очень одобренным дополнением при контакте с большими наборами данных.

6
задан 16 revs, 2 users 82% 23 May 2017 в 12:00
поделиться

5 ответов

It is indeed dangerous and the safest alternative is ast.literal_eval (see the ast module in the standard library). You can of course build and alter an ast to provide e.g. evaluation of variables and the like before you eval the resulting AST (when it's down to literals).

The possible exploit of eval starts with any object it can get its hands on (say True here) and going via .__class_ to its type object, etc. up to object, then gets its subclasses... basically it can get to ANY object type and wreck havoc. I can be more specific but I'd rather not do it in a public forum (the exploit is well known, but considering how many people still ignore it, revealing it to wannabe script kiddies could make things worse... just avoid eval on unsanitized user input and live happily ever after!-).

19
ответ дан 8 December 2019 в 02:35
поделиться

Facebook.com

  • MySQL с MyRocks . Используется для хранения информации о пользователях и социальных действий, таких как лайки, комментарии и публикации.
  • Hive (хранилище данных для Hadoop, поддерживает таблицы и вариант SQL, называемый hiveQL). Используется для «простых задач суммирования, бизнес-аналитики, машинного обучения и многих других приложений»
  • Cassandra (многомерное распределенное хранилище значений ключей). В настоящее время используется для обмена личными сообщениями Facebook.

В настоящее время работает 610 (скоро будет 1000) узлов Hadoop в одном кластере с хранилищем данных Hive. И Hive, и Cassandra были открыты в Facebook.

Статистика Facebook: literal_eval, который будет безопасно обрабатывать как строки, так и другие простые типы данных, такие как кортежи. Это, вероятно, наиболее безопасное и полное решение.

Однако другой возможностью является использование кодека escape-последовательности . Это намного быстрее, чем eval (примерно в 10 раз согласно timeit), доступный в более ранних версиях, чем literal_eval, и должен делать то, что вы хотите:

>>> s = 'he\nllo\' wo"rld\0\x03\r\n\tabc'
>>> repr(s)[1:-1].decode('string-escape') == s
True

([1: -1] - это удаление внешних кавычек, которые добавляет repr.)

4
ответ дан 8 December 2019 в 02:35
поделиться

Generally, you should never allow anyone to post code.

So called "paid professional programmers" have a hard-enough time writing code that actually works.

Accepting code from the anonymous public -- without benefit of formal QA -- is the worst of all possible scenarios.

Professional programmers -- without good, solid formal QA -- will make a hash of almost any web site. Indeed, I'm reverse engineering some unbelievably bad code from paid professionals.

The idea of allowing a non-professional -- unencumbered by QA -- to post code is truly terrifying.

3
ответ дан 8 December 2019 в 02:35
поделиться

If you can prove beyond doubt that unsanitized_user_input is a str instance from the Python built-ins with nothing tampered, then this is always safe. In fact, it'll be safe even without all those extra arguments since eval(repr(astr)) = astr for all such string objects. You put in a string, you get back out a string. All you did was escape and unescape it.

This all leads me to think that eval(repr(x)) isn't what you want--no code will ever be executed unless someone gives you an unsanitized_user_input object that looks like a string but isn't, but that's a different question--unless you're trying to copy a string instance in the slowest way possible :D.

8
ответ дан 8 December 2019 в 02:35
поделиться
 repr ([unsanitized_user_input_1,
 unsanitized_user_input_2,
 ...

... unsanitized_user_input - это объект str

Вам не нужно сериализовать строки, чтобы сохранить их в базе данных ..

Если это все строки , как вы упомянули - почему вы не можете просто сохранить строки в db.StringListProperty ?

Вложенные записи могут быть немного сложнее, но почему это так? Когда вам приходится прибегать к eval для получения данных из базы данных, вы, вероятно, делаете что-то не так ..

Не могли бы вы сохранить каждый unsanitized_user_input_x как собственный db.StringProperty и сгруппировать их по ссылочному полю?

Любой из них может быть неприменим, поскольку я понятия не имею, чего вы пытаетесь достичь, но моя точка зрения - нельзя ли структурировать данные в как ты где не

1
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: