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

Использование белых списков для символов в пользовательском вводе

Описание

Использование белых списков (whitelists) для символов в пользовательском вводе — это метод валидации данных, который позволяет только определённые, заранее определённые символы или форматы. Это помогает предотвратить различные атаки, такие как SQL-инъекции, XSS (межсайтовый скриптинг) и другие виды инъекций.

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

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

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

Определение допустимых символов:

  • Создайте список разрешённых символов для каждого поля ввода. Например, для имени пользователя это могут быть буквы, цифры и символы подчеркивания. Пример:
def is_valid_username(username):
    allowed_characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
    return all(char in allowed_characters for char in username)

# Примеры использования
print(is_valid_username("valid_username"))  # True
print(is_valid_username("invalid@username"))  # False

Регулярные выражения: Используйте регулярные выражения для проверки ввода. Например, для проверки адреса электронной почты можно использовать регулярное выражение, которое допускает только определённые символы. Пример:

import re

def is_valid_email(email):
    # Регулярное выражение для проверки адреса электронной почты
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return re.match(pattern, email) is not None

# Примеры использования
print(is_valid_email("user@example.com"))  # True
print(is_valid_email("user@.com"))  # False

Серверная валидация: Всегда выполняйте валидацию на сервере, даже если вы уже проверили данные на клиенте. Это поможет предотвратить обход валидации. Пример:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form.get('username')
    if not is_valid_username(username):
        return jsonify({"error": "Invalid username"}), 400
    # Обработка валидного ввода
    return jsonify({"success": "Username is valid"}), 200

if __name__ == '__main__':
    app.run()

Обработка ошибок: Предоставьте пользователям понятные сообщения об ошибках, если их ввод не соответствует требованиям. Пример:

def process_input(user_input):
    if not is_valid_username(user_input):
        raise ValueError("Invalid username. Only letters, numbers, and underscores are allowed.")

    # Дальнейшая обработка валидного ввода
    print(f"Processing input: {user_input}")

# Примеры использования
try:
    process_input("valid_username")  # Успешно
    process_input("invalid@username")  # Выдаст ошибку
except ValueError as e:
    print(e)  # "Invalid username. Only letters, numbers, and underscores are allowed."

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

# Пример уязвимого кода на Python
def process_input(user_input):
    # Нет проверки на допустимые символы
    query = f"SELECT * FROM users WHERE username = '{user_input}'"
    execute_query(query)

# Пример использования
process_input("admin'; DROP TABLE users; --")

Проблема: В этом коде пользователь может ввести вредоносный SQL-код, что приведет к SQL-инъекции.

Пример безопасного кода с использованием белых списков

import re

def is_valid_username(username):
    # Разрешаем только буквы, цифры и символы подчеркивания
    return re.match("^[a-zA-Z0-9_]+$", username) is not None

def process_input(user_input):
    if not is_valid_username(user_input):
        raise ValueError("Invalid username")

    query = f"SELECT * FROM users WHERE username = '{user_input}'"
    execute_query(query)

# Пример использования
process_input("admin")  # Безопасно
process_input("admin'; DROP TABLE users; --")  # Выдаст ошибку

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

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

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

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