Ответ
Безопасность данных — это многослойная защита. В своих проектах я реализую следующие меры, начиная с самого критичного уровня — кода.
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.