Используйте белые списки разрешенных символов в user-input
Описание
Это требование подразумевает, что вводимые пользователями данные должны проходить строгую проверку на основе белого списка разрешенных символов. Белый список — это набор символов, которые считаются допустимыми для ввода. Всё, что не входит в этот список, должно быть отклонено или экранировано. Такой подход помогает предотвратить множество атак, связанных с вводом вредоносных данных.
Почему это важно
- Защита от инъекций: Фильтрация вводимых данных с использованием белых списков помогает предотвратить атаки, такие как SQL-инъекции, XSS (межсайтовый скриптинг) и командные инъекции.
- Снижение рисков эксплуатации уязвимостей: Белые списки позволяют ограничить ввод только безопасными символами, что снижает вероятность успешной эксплуатации уязвимостей через ввод данных.
- Улучшение безопасности данных: Принудительное использование допустимых символов повышает общую безопасность приложения, не допуская внесения вредоносных данных.
Способы реализации с примерами
Определение белого списка символов: Необходимо определить, какие символы являются допустимыми для ввода. Например, для ввода имени пользователя разрешены только буквы, цифры, нижние подчеркивания и дефисы.
Пример (фильтрация ввода на 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 или другим атакам.
Причины, к которым может привести несоблюдение требования
- Уязвимость к SQL-инъекциям: Неправильная валидация пользовательских данных может позволить злоумышленникам выполнить SQL-инъекцию, которая приведет к доступу к данным или их уничтожению.
- Уязвимость к XSS-атакам: Непроверенный ввод может позволить внедрить вредоносный JavaScript-код, что приведет к межсайтовому скриптингу и компрометации данных пользователей.
- Командные инъекции: Если в приложении используется команда на уровне операционной системы, непроверенный ввод может позволить злоумышленнику выполнить произвольные команды на сервере.
Рекомендации
- Определите и используйте белые списки разрешенных символов для каждого типа пользовательского ввода (имя пользователя, адрес электронной почты и т.д.).
- Обновляйте и проверяйте белые списки, основываясь на типе данных, которые могут быть допустимы для конкретного поля.
- Регулярно проводите аудит безопасности для выявления уязвимостей, связанных с вводом данных.
- Рассмотрите возможность использования библиотек для фильтрации и валидации данных, которые уже реализуют защитные механизмы от наиболее распространенных атак.