Перейти к содержанию

Используйте белые списки разрешенных символов в user-input

Описание

Это требование подразумевает, что вводимые пользователями данные должны проходить строгую проверку на основе белого списка разрешенных символов. Белый список — это набор символов, которые считаются допустимыми для ввода. Всё, что не входит в этот список, должно быть отклонено или экранировано. Такой подход помогает предотвратить множество атак, связанных с вводом вредоносных данных.

Почему это важно

  1. Защита от инъекций: Фильтрация вводимых данных с использованием белых списков помогает предотвратить атаки, такие как SQL-инъекции, XSS (межсайтовый скриптинг) и командные инъекции.
  2. Снижение рисков эксплуатации уязвимостей: Белые списки позволяют ограничить ввод только безопасными символами, что снижает вероятность успешной эксплуатации уязвимостей через ввод данных.
  3. Улучшение безопасности данных: Принудительное использование допустимых символов повышает общую безопасность приложения, не допуская внесения вредоносных данных.

Способы реализации с примерами

Определение белого списка символов: Необходимо определить, какие символы являются допустимыми для ввода. Например, для ввода имени пользователя разрешены только буквы, цифры, нижние подчеркивания и дефисы.

Пример (фильтрация ввода на Python):

import re

def validate_username(username):
    # Белый список символов: буквы, цифры, подчеркивания и дефисы
    pattern = re.compile(r'^[a-zA-Z0-9_-]+$')
    if pattern.match(username):
        return True
    return False

# Пример использования
username = "valid_username-123"
if validate_username(username):
    print("Username is valid")
else:
    print("Invalid username")

Пример (фильтрация ввода на PHP):

function validate_username($username) {
    // Белый список символов: буквы, цифры, подчеркивания и дефисы
    if (preg_match('/^[a-zA-Z0-9_-]+$/', $username)) {
        return true;
    }
    return false;
}

// Пример использования
$username = "valid_username_456";
if (validate_username($username)) {
    echo "Username is valid";
} else {
    echo "Invalid username";
}

Пример (фильтрация ввода на JavaScript):

function validateUsername(username) {
    // Белый список символов: буквы, цифры, подчеркивания и дефисы
    const pattern = /^[a-zA-Z0-9_-]+$/;
    return pattern.test(username);
}

// Пример использования
const username = "user_name_789";
if (validateUsername(username)) {
    console.log("Username is valid");
} else {
    console.log("Invalid username");
}

Примеры уязвимого кода

// Пример уязвимого кода
function validate_username($username) {
    // Валидация отсутствует, принимается любой ввод
    return true;
}

Проблема: Отсутствие валидации позволяет злоумышленникам вводить произвольные данные, что может привести к SQL-инъекциям, XSS или другим атакам.

Причины, к которым может привести несоблюдение требования

  1. Уязвимость к SQL-инъекциям: Неправильная валидация пользовательских данных может позволить злоумышленникам выполнить SQL-инъекцию, которая приведет к доступу к данным или их уничтожению.
  2. Уязвимость к XSS-атакам: Непроверенный ввод может позволить внедрить вредоносный JavaScript-код, что приведет к межсайтовому скриптингу и компрометации данных пользователей.
  3. Командные инъекции: Если в приложении используется команда на уровне операционной системы, непроверенный ввод может позволить злоумышленнику выполнить произвольные команды на сервере.

Рекомендации

  • Определите и используйте белые списки разрешенных символов для каждого типа пользовательского ввода (имя пользователя, адрес электронной почты и т.д.).
  • Обновляйте и проверяйте белые списки, основываясь на типе данных, которые могут быть допустимы для конкретного поля.
  • Регулярно проводите аудит безопасности для выявления уязвимостей, связанных с вводом данных.
  • Рассмотрите возможность использования библиотек для фильтрации и валидации данных, которые уже реализуют защитные механизмы от наиболее распространенных атак.