Категория > Новости > Безопасный питон. Осваиваем приемы защищенного кодинга на Python - «Новости»
Безопасный питон. Осваиваем приемы защищенного кодинга на Python - «Новости»30-05-2023, 13:31. Автор: Gimson |
классический. Вот как выглядит безопасная версия этого кода: def get_user(name): query = "SELECT * FROM users WHERE name = ?" return execute_query(query, (name,)) Здесь мы используем параметризованный запрос, то есть передаем имя пользователя отдельно, и наша база данных гарантированно его экранирует. Это значит, что, даже если пользователь попытается ввести SQL-код, тот будет воспринят просто как строка и ничего плохого не произойдет. Читайте также - Новости онлайн, видео, фото, актуальные передачи, шоу, прямой эфир, трансляция, тв, радио и подкасты. Политика, бизнес, происшествия - Смотреть новости. Но это только начало. Всегда помни: ты должен доверять пользовательским данным настолько, насколько доверяешь незнакомцу, вдруг предлагающему тебе сладкую конфету. Используй безопасные методы сериализации и десериализацииЧто за страшные слова — «сериализация» и «десериализация»? Не вызывают ли они дереализацию? Не пугайся! Сериализация — это по сути просто превращение всяких структур вроде списков и словарей в строку, которую легко хранить на диске или передавать по сети. Десериализация — обратный процесс, то есть превращение последовательности символов в структуру. Здесь кроется целый класс уязвимостей. Если превращать строки в структуры неаккуратно, то злоумышленник, манипулируя данными, сможет перехватить управление твоей программой. Пример опасного кода: import pickle # Никогда так не делай! def unsafe_deserialization(serialized_data): return pickle.loads(serialized_data) В этом примере я использовал модуль pickle для десериализации данных. Это удобно, но pickle не обеспечивает безопасность. Если злоумышленник подменит сериализованные данные, он сможет выполнить произвольный код на твоем компьютере. Хороший пример: import json # Гораздо лучше! def safe_deserialization(serialized_data): return json.loads(serialized_data) Здесь я использую для десериализации модуль json. Он не позволяет выполнить произвольный код, так что он безопаснее. Всегда помни о рисках и выбирай безопасные методы! infoУязвимости, вызванные ошибками в десериализации, периодически находят в крупных продуктах. Например, в 2023 году была найдена уязвимость в GoAnywhere MFT. Она позволяла удаленным атакующим выполнять код без аутентификации. Используй принцип наименьших привилегийЭтот принцип гласит: дай программе только те привилегии, которые ей действительно нужны для выполнения ее задачи. Это очень важно для безопасности, потому что, если злоумышленник взломает твою программу, он получит те же привилегии, что и программа. Если ее привилегии ограниченны, сузится и круг возможных действий злоумышленника. Посмотрим на пример. Представь, что у тебя есть функция, которая должна записывать данные в файл: def write_to_file(file_path, data): with open(file_path, 'w') as f: f.write(data) Этой функции не нужны никакие привилегии, кроме возможности записи в конкретный файл. Но если ты запустишь эту функцию с привилегиями администратора, злоумышленник, взломавший эту функцию, сможет делать в системе абсолютно все. Всегда давай своим функциям и программам только те привилегии, которые им действительно нужны, и ничего больше. Избегай уязвимостей, связанных с аутентификацией и авторизациейБезопасная авторизация пользователей — это огромная тема, в которой есть масса подводных камней. Впрочем, некоторых из них избежать очень легко. Безопасное хранение паролейНачнем с того, что абсолютно недопустимо. Никогда (никогда!) не храни пароли в открытом виде. Например, вот так: users = { "alice": "password123", "bob": "qwerty321" } Если эти данные утекут (а вероятность этого всегда есть), то все пароли твоих пользователей станут известны. Так как же делать правильно? Нужно использовать хеширование паролей. Хеширование — это процесс, при котором из пароля генерируется уникальная строка фиксированной длины. При этом уникальность хеша означает, что даже незначительное изменение в исходном пароле полностью изменит его хеш. В Python для хеширования можно использовать модуль hashlib. Посмотрим, как это работает, на примере: import hashlib password = "password123" hashed_password = hashlib.sha256(password.encode()).hexdigest() print(hashed_password) Теперь, даже если база данных утечет, хакеры увидят только хеши паролей, а не сами пароли. Соль для паролейПерейти обратно к новости |