1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-secguide

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Python安全指南.md 9.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 00:55 2e0ef3e
  1. При использовании симметричного алгоритма шифрования необходимо защищать ключ шифрования. Когда алгоритм касается чувствительных или бизнес-данных, можно использовать асимметричный алгоритм для согласования ключа шифрования. Для защиты ключа можно использовать другие методы, такие как алгоритмы преобразования и т. д., для менее чувствительных данных.

2.3.2 Обязательное предотвращение жёсткого кодирования чувствительных настроек:

  • Запрещается жёсткое кодирование AK/SK, IP, учётных данных базы данных и других конфигураций в исходном коде.
  • Следует использовать систему конфигурации или систему управления ключами KMS.

Класс бэкенда

I. Реализация кода

1.1 Проверка ввода

1.1.1 Обязательная проверка данных по типу:

  • Все внешние параметры программы должны быть проверены. Проверка включает, но не ограничивается следующими аспектами: длина данных, диапазон данных, тип и формат данных. Если проверка не пройдена, следует отказаться от данных.
  • Рекомендуется использовать следующие компоненты: Cerberus, jsonschema, Django-Validators.
# Пример Cerberus
v = Validator({'name': {'type': 'string'}})
v.validate({'name': 'john doe'})

# Пример jsonschema
schema = {
     "type" : "object",
     "properties" : {
         "price" : {"type" : "number"},
         "name" : {"type" : "string"},
     },
}

validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)

1.2 Операции SQL

1.2.1 Обязательное использование параметризованных запросов:

  • Используйте параметризованные SQL-запросы, чтобы строго различать данные и команды и избегать уязвимостей SQL-инъекций.
# Неправильный пример
import mysql.connector

mydb = mysql.connector.connect(
... ...
)

cur = mydb.cursor()
userid = get_id_from_user()
# Использование% для непосредственного форматирования строки и объединения SQL-запроса
cur.execute("SELECT `id`, `password` FROM `auth_user` WHERE `id`=%s " % (userid,)) 
myresult = cur.fetchall()
# Безопасный пример
import mysql.connector

mydb = mysql.connector.connect(
... ...
)
cur = mydb.cursor()
userid = get_id_from_user()
# Передача кортежа в качестве параметра
cur.execute("SELECT `id`, `password` FROM `auth_user` WHERE `id`=%s " , (userid,))
myresult = cur.fetchall()
  • Рекомендуется использовать ORM-фреймворк для работы с базой данных, например SQLAlchemy.
# Установка sqlalchemy и инициализация соединения с базой данных
# pip install sqlalchemy
from sqlalchemy import create_engine
# Инициализация подключения к базе данных, изменение на ваше имя пользователя и пароль базы данных
engine = create_engine('mysql+mysqlconnector://user:password@host:port/DATABASE')
# Ссылка на типы данных
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
# Определение объекта Player:
class Player(Base):
    # Имя таблицы:
    __tablename__ = 'player'

    # Структура таблицы:
    player_id = Column(Integer, primary_key=True, autoincrement=True)
    team_id = Column(Integer)
    player_name = Column(String(255))
    height = Column(Float(3, 2))
# Вставка, удаление, обновление и запрос
from sqlalchemy.orm import sessionmaker
# Создание типа DBSession:
DBSession = sessionmaker(bind=engine)
# Создание объекта сеанса:
session = DBSession()

# Добавление:
new_player = Player(team_id=101, player_name="Tom", height=1.98)
session.add(new_player)
# Удаление:
row = session.query(Player).filter(Player.player_name=="Tom").first()
session.delete(row)
# Обновление:
row = session.query(Player).filter(Player.player_name=="Tom").first()
row.height = 1.99
# Запрос:
rows = session.query(Player).filter(Player.height >= 1.88).all()

# Сохранение в базу данных:
session.commit()
# Закрытие сеанса:
session.close()

1.2.2 Обязательная фильтрация параметров:

  • При динамическом объединении внешних параметров в SQL-запрос необходимо фильтровать параметры.
def sql_filter(sql, max_length=20):
    dirty_stuff = ["\"", "\\", "/", "*", "'", "=", "-", "#", ";", "<", ">", "+", 
                   "&", "$", "(", ")", "%", "@", ","]
    for stuff in dirty_stuff:
        sql = sql.replace(stuff, "x")
    return sql[:max_length]

1.3 Выполнение команд

1.3.1 Рекомендуется избегать прямого вызова функций для выполнения системных команд:

  • В реализации связанных функций следует избегать прямого вызова системных команд (таких как os.system(), os.popen(), subprocess.call() и т.д.), предпочтительно использовать другие аналогичные операции для замены, например, выполнять операции с файловой системой через API файловой системы вместо прямого вызова команд операционной системы.
  • Если невозможно избежать, при выполнении команд следует избегать объединения внешних данных и одновременно ограничивать выполнение команд белым списком.

1.3.2 Обязательно фильтровать символы, передаваемые в функции выполнения команд:

  • Когда программа вызывает различные функции для выполнения системных команд, если команда передаётся извне, фильтруйте символы, которые могут использоваться для внедрения команд.
import os
import sys
import shlex

domain = sys.argv[1]
# Замена символов, которые можно использовать для внедрения команд, на пробелы
badchars = "\n&;|'\"$()`-"
for char in badchars:
    domain = domain.replace(char, " ")

result = os.system("nslookup " + shlex.quote(domain))

1.3.3 Обязательно запрещать небезопасный код выполнения:

  • Не используйте функцию eval для обработки данных, полученных извне.

1.4 Операции с файлами

1.4.1 Обязательно ограничение типов файлов:

  • Строго проверяйте типы и размеры загружаемых или скачиваемых файлов через белый список. Разрешайте только файлы, необходимые для бизнеса, и избегайте загрузки вредоносных файлов, таких как вирусы, трояны и веб-шеллы.
import os
  
ALLOWED_EXTENSIONS = ['txt','jpg','png']
  
def allowed_file(filename):
    if ('.' in filename and 
        '..' not in filename and 
        os.path.splitext(filename)[1].lower() in ALLOWED_EXTENSIONS):
        
        return filename
    return None

1.4.2 Обязательно запретить хранение внешних файлов в каталоге исполняемых файлов:

  • Запретите хранить внешние файлы в каталоге WEB-контейнера, который может быть выполнен (appBase). Рекомендуется использовать библиотеку tempfile для обработки временных файлов и каталогов.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-secguide.git
git@api.gitlife.ru:oschina-mirror/mirrors-secguide.git
oschina-mirror
mirrors-secguide
mirrors-secguide
main