Как обеспечить безопасность данных

«Как обеспечить безопасность данных» — вопрос из категории Безопасность, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. Защита от инъекций (SQL, NoSQL, Command). Всегда использую подготовленные выражения или ORM.

// НЕВЕРНО: Уязвимо к SQL-инъекции
query := fmt.Sprintf("SELECT * FROM users WHERE email='%s'", userInput)

// ВЕРНО: Использование подготовленного выражения
rows, err := db.Query("SELECT * FROM users WHERE email=$1", userInput)

2. Валидация и санация всех входных данных. Использую строгие схемы валидации на границе приложения (API).

import "github.com/go-playground/validator/v10"
type UserInput struct {
    Email    string `json:"email" validate:"required,email"`
    Password string `json:"password" validate:"required,min=8"`
}

func handleRequest(input UserInput) error {
    validate := validator.New()
    if err := validate.Struct(input); err != nil {
        return err // Возвращаем 400 Bad Request
    }
    // ... дальнейшая обработка
}

3. Безопасное хранение паролей. Только современные алгоритмы хеширования.

import "golang.org/x/crypto/bcrypt"

func hashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    return string(bytes), err
}

func checkPasswordHash(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    return err == nil
}

4. Защита на транспортном уровне. Обязательное использование HTTPS с современными настройками (TLS 1.3, строгие шифры). Все внутренние сервисы также общаются по mTLS.

5. Заголовки безопасности HTTP. Автоматически добавляю их через middleware.

func securityHeaders(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Security-Policy", "default-src 'self';")
        w.Header().Set("X-Content-Type-Options", "nosniff")
        w.Header().Set("X-Frame-Options", "DENY")
        w.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
        next.ServeHTTP(w, r)
    })
}

6. Управление секретами. Никаких секретов в коде или репозитории. Использую HashiCorp Vault или managed-сервисы (AWS Secrets Manager) с ротацией ключей.

7. Регулярное обновление зависимостей. Интегрировал dependabot или renovatebot для автоматического создания PR с обновлениями, особенно security-патчами.

8. Шифрование данных в покое. Для чувствительных данных (PII) в базе использую прозрачное шифрование на уровне приложения или БД. Например, шифрую определенные поля перед записью с использованием ключей из Vault.