Перейти до основного вмісту

Безпека

WebdriverIO враховує аспект безпеки при наданні рішень. Нижче наведені деякі способи кращого захисту ваших тестів.

Найкращі практики

  • Ніколи не вписуйте в код безпосередньо конфіденційні дані, які можуть зашкодити вашій організації, якщо вони будуть розкриті у відкритому тексті.
  • Використовуйте механізм (наприклад, сховище) для безпечного зберігання ключів і паролів та отримання їх при запуску ваших наскрізних тестів.
  • Перевіряйте, що конфіденційні дані не відображаються в журналах та у хмарних провайдерів, наприклад, токени аутентифікації в журналах мережі.
інфо

Навіть для тестових даних важливо запитати, чи зможе зловмисник у разі отримання доступу отримати інформацію або використати ці ресурси зі злими намірами.

Маскування конфіденційних даних

Якщо ви використовуєте конфіденційні дані під час тестування, важливо переконатися, що вони не видимі для всіх, наприклад, у журналах. Крім того, при використанні хмарного провайдера часто задіяні приватні ключі. Ця інформація повинна бути замаскована в журналах, репортерах та інших точках контакту. Нижче наведені деякі рішення для маскування при запуску тестів без розкриття цих значень.

WebDriverIO

Маскування текстових значень команд

Команди addValue та setValue підтримують булеве значення mask для маскування в журналах, а також у репортерах. Крім того, інші інструменти, такі як інструменти продуктивності та сторонні інструменти, також отримуватимуть замасковану версію, підвищуючи безпеку.

Наприклад, якщо ви використовуєте реального виробничого користувача і вам потрібно ввести пароль, який ви хочете замаскувати, то це можливо за допомогою наступного:

  async enterPassword(userPassword) {
const passwordInputElement = $('Password');

// Get focus
await passwordInputElement.click();

await passwordInputElement.setValue(userPassword, { mask: true });
}

Вищенаведений код приховає текстове значення з журналів WDIO таким чином:

Приклад журналів:

INFO webdriver: DATA { text: "**MASKED**" }

Репортери, такі як Allure, та сторонні інструменти, такі як Percy від BrowserStack, також оброблятимуть замасковану версію. Разом з відповідною версією Appium, журнали Appium також не міститимуть ваших конфіденційних даних.

інфо

Обмеження:

  • В Appium додаткові плагіни можуть витікати інформацію, навіть якщо ми просимо замаскувати інформацію.
  • Хмарні провайдери можуть використовувати проксі для HTTP-журналювання, що обходить встановлений механізм маскування.
  • Команда getValue не підтримується. Крім того, якщо вона використовується для того ж елемента, вона може розкрити значення, яке планувалося замаскувати при використанні addValue або setValue.

Мінімальна необхідна версія:

  • WDIO v9.15.0
  • Appium v3.0.0

Маскування в журналах WDIO

За допомогою конфігурації maskingPatterns ми можемо маскувати конфіденційну інформацію з журналів WDIO. Однак журнали Appium не покриваються.

Наприклад, якщо ви використовуєте хмарного провайдера і використовуєте рівень інформації (info), то, швидше за все, ви "витікаєте" ключ користувача, як показано нижче:

INFO @wdio/local-runner: Start worker 0-0 with arg: ./wdio.conf.ts --user=cloud_user --key=myCloudSecretExposedKey --spec myTest.test.ts

Щоб протидіяти цьому, ми можемо передати регулярний вираз '--key=([^ ]*)', і тепер у журналах ви побачите

INFO @wdio/local-runner: Start worker 0-0 with arg: ./wdio.conf.ts --user=cloud_user --key=**MASKED** --spec myTest.test.ts

Ви можете досягти вищезазначеного, надавши регулярний вираз у поле maskingPatterns конфігурації.

export const config: WebdriverIO.Config = {
specs: [...],
capabilities: [{...}],
services: ['lighthouse'],

/**
* test configurations
*/
logLevel: 'info',
maskingPatterns: '/--key=([^ ]*)/',
framework: 'mocha',
outputDir: __dirname,

reporters: ['spec'],

mochaOpts: {
ui: 'bdd',
timeout: 60000
}
}
інфо

Мінімальна необхідна версія:

  • WDIO v9.15.0

Вимкнення журналів WDIO

Інший спосіб блокування журналювання конфіденційних даних — знизити або відключити рівень журналювання чи вимкнути журнал. Це можна зробити таким чином:

import logger from '@wdio/logger';

/**
* Set the logger level of the WDIO logger to 'silent' before *running a promise, which helps hide sensitive information in the logs.
*/
export const withSilentLogger = async <T>(promise: () => Promise<T>): Promise<T> => {
const webdriverLogLevel = driver.options.logLevel ?? 'error';

try {
logger.setLevel('webdriver', 'silent');
return await promise();
} finally {
logger.setLevel('webdriver', webdriverLogLevel);
}
};

Сторонні рішення

Appium

Appium пропонує своє рішення для маскування; див. Log filter

  • Їхнє рішення може бути складним у використанні. Один із способів — передати в рядку токен, наприклад, @mask@ і використовувати його як регулярний вираз
  • У деяких версіях Appium значення також журналюються з розділенням кожного символу комами, тому потрібно бути обережним.
  • На жаль, BrowserStack не підтримує це рішення, але воно все ще корисне локально

Використовуючи приклад @mask@, згаданий раніше, ми можемо використовувати наступний JSON-файл з назвою appiumMaskLogFilters.json

[
{
"pattern": "@mask@(.*)",
"flags": "s",
"replacer": "**MASKED**"
},
{
"pattern": "\\[(\\\"@\\\",\\\"m\\\",\\\"a\\\",\\\"s\\\",\\\"k\\\",\\\"@\\\",\\S+)\\]",
"flags": "s",
"replacer": "[*,*,M,A,S,K,E,D,*,*]"
}
]

Потім передайте назву JSON-файлу в поле logFilters конфігурації сервісу appium:

import { AppiumServerArguments, AppiumServiceConfig } from '@wdio/appium-service';
import { ServiceEntry } from '@wdio/types/build/Services';

const appium = [
'appium',
{
args: {
log: './logs/appium.log',
logFilters: './appiumMaskLogFilters.json',
} satisfies AppiumServerArguments,
} satisfies AppiumServiceConfig,
] satisfies ServiceEntry;

BrowserStack

BrowserStack також пропонує певний рівень маскування для приховування деяких даних; див. hide sensitive data

  • На жаль, це рішення працює за принципом "все або нічого", тому всі текстові значення наданих команд будуть замасковані.

Welcome! How can I help?

WebdriverIO AI Copilot