Тестирование веб-приложений с использованием Protractor часто требует работы с конфиденциальными данными: учетными записями пользователей, токенами доступа, паролями, ключами API. Некорректная организация хранения и использования этих данных может привести к утечкам и нарушению политики безопасности. Рассмотрены методы безопасной работы с конфиденциальной информацией в рамках тестов на JavaScript.
Переменные окружения Наиболее безопасный способ хранения секретов — использование переменных окружения. Значения паролей, токенов и ключей не помещаются в кодовую базу, а задаются при запуске тестов:
export TEST_USER_PASSWORD='SuperSecretPassword'
export API_KEY='1234567890abcdef'
В тестах Protractor к ним можно обращаться через объект
process.env:
const userPassword = process.env.TEST_USER_PASSWORD;
const apiKey = process.env.API_KEY;
browser.get('https://example.com/login');
element(by.id('password')).sendKeys(userPassword);
Преимущества:
Файлы конфигурации вне репозитория Можно
использовать отдельный файл, например secrets.json, который
хранится только локально или в защищенном хранилище. Структура
файла:
{
"user": {
"email": "test@example.com",
"password": "SuperSecretPassword"
},
"api": {
"key": "1234567890abcdef"
}
}
Загрузка в тестах:
const secrets = require('/path/to/secrets.json');
element(by.id('email')).sendKeys(secrets.user.email);
element(by.id('password')).sendKeys(secrets.user.password);
Важно исключить такой файл из системы контроля версий
(.gitignore) и ограничить доступ правами файловой
системы.
Тестовые отчеты и логи Protractor могут случайно содержать конфиденциальную информацию. Для предотвращения этого:
function maskPassword(password) {
return '*'.repeat(password.length);
}
console.log('Введен пароль: ' + maskPassword(userPassword));
winston или встроенные возможности Protractor. Логи должны
хранить только метаданные и статусы тестов, но не реальные пароли или
ключи API.В тестах желательно работать с временными учетными данными, создаваемыми специально для автоматизации:
Пример создания временного токена:
const fetch = require('node-fetch');
async function getTestToken() {
const response = await fetch('https://api.example.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user: 'test', password: process.env.TEST_USER_PASSWORD })
});
const data = await response.json();
return data.token;
}
Для хранения секретов в файлах или базах данных можно использовать шифрование:
const crypto = require('crypto');
function encrypt(text, key) {
const cipher = crypto.createCipher('aes-256-cbc', key);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
function decrypt(encrypted, key) {
const decipher = crypto.createDecipher('aes-256-cbc', key);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
Ключ шифрования хранится отдельно в переменной окружения, а сами данные в репозитории остаются в зашифрованном виде. Такой подход снижает риск раскрытия секретов при компрометации репозитория.
Тестовые аккаунты и токены должны иметь ограниченный срок действия. Примеры:
beforeAll
и afterAll.beforeAll(async () => {
testToken = await getTestToken();
});
afterAll(async () => {
await revokeTestToken(testToken);
});
Такой подход предотвращает накопление неиспользуемых учетных данных и минимизирует риски безопасности.
Для крупных проектов рекомендуется использовать специализированные хранилища секретов:
В тестах Protractor можно загружать конфиденциальные данные непосредственно из этих систем через API, избегая хранения секретов на локальной машине.
const vault = require('node-vault')({ endpoint: process.env.VAULT_ADDR, token: process.env.VAULT_TOKEN });
const secret = await vault.read('secret/data/test-user');
element(by.id('password')).sendKeys(secret.data.password);
Обеспечение конфиденциальности в Protractor-тестах требует комплексного подхода: правильная организация хранения данных, шифрование, маскирование логов и использование временных учетных записей. Следование этим методам позволяет автоматизировать тесты без риска утечки критичной информации.