Knowledge Base
Утечка исходного кода через Source Maps (.map файлы)
Утечка исходного кода через Source Maps
Категория: Web Application Security · Риск: medium
Утечка исходного кода через Source Maps
Что такое Source Maps
Source maps (`.js.map`) — файлы, позволяющие браузерным DevTools отображать минифицированный JavaScript как оригинальный исходный код (с именами переменных, структурой файлов, комментариями).
Если `.map`-файлы доступны публично на production-сервере, **любой человек может скачать полный оригинальный исходный код вашего фронтенда**.
Что утекает
- Логика бизнес-правил клиентской части
- Жёстко зашитые API-ключи, токены (например, Google Maps API key)
- Внутренние URL API, эндпойнты
- Имена сотрудников, email-адреса в комментариях
- Алгоритмы проверки входных данных (помогает в обходе валидации)
Проверка
# Проверить наличие map-файлов
curl -si https://example.com/static/app.js | grep sourceMappingURL
# Если в конце: //# sourceMappingURL=app.js.map
curl -si https://example.com/static/app.js.map | head -5
# Опасно если вернёт 200 + JSON содержимое
Как закрыть доступ
Nginx — заблокировать .map файлы
# Запретить прямой доступ к source maps
location ~* \.map$ {
deny all;
return 404;
access_log off;
log_not_found off;
}
Webpack — не генерировать source maps в production
// webpack.config.js
module.exports = {
mode: 'production',
devtool: false, // отключить source maps полностью
// или:
devtool: 'hidden-source-map', // генерировать но не ссылаться в JS
};
Vite
// vite.config.js
export default {
build: {
sourcemap: false, // или 'hidden'
}
};
Create React App
# В .env.production
GENERATE_SOURCEMAP=false
Hidden source maps (компромисс)
Вариант `hidden-source-map` генерирует `.map`-файл но **не** добавляет ссылку `//# sourceMappingURL=` в JS. Файлы существуют для Sentry/мониторинга ошибок, но не доступны через браузер.
# Разрешить доступ только с IP Sentry
location ~* \.map$ {
allow 35.202.0.0/16; # Sentry IP range
deny all;
}
Когда source maps нужны
- Для Sentry/Rollbar (загрузить символы через CLI, не публично)
- Для внутреннего staging-окружения
# Загрузка в Sentry без публикации
sentry-cli releases files <version> upload-sourcemaps ./build
Связанные проверки
- [.git репозиторий публично](/kb/web_app_security/open-backup-files)
- [Утечка версии сервера](/kb/http/server-header-leakage)