Перейти к основному содержанию

Безопасность

WebdriverIO учитывает аспект безопасности при создании решений. Ниже приведены некоторые способы повышения безопасности ваших тестов.

Лучшие практики

  • Никогда не кодируйте конфиденциальные данные, которые могут нанести вред вашей организации при раскрытии в виде открытого текста.
  • Используйте механизм (например, хранилище) для безопасного хранения ключей и паролей и извлечения их при запуске end-to-end тестов.
  • Проверяйте, что конфиденциальные данные не раскрываются в логах и облачным провайдером, например, токены аутентификации в сетевых логах.
информация

Даже для тестовых данных важно спросить, может ли злоумышленник получить информацию или использовать эти ресурсы со злым умыслом.

Маскировка конфиденциальных данных

Если вы используете конфиденциальные данные во время тестирования, важно убедиться, что они не видны всем, например, в логах. Также при использовании облачного провайдера часто задействованы приватные ключи. Эта информация должна быть скрыта от логов, репортеров и других точек соприкосновения. Далее представлены некоторые решения для маскировки данных при запуске тестов без раскрытия этих значений.

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 конфигурации.

  • Для нескольких регулярных выражений используйте одну строку со значениями, разделенными запятыми.
  • Для получения дополнительной информации о шаблонах маскирования см. раздел Masking Patterns в README WDIO Logger.
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