Przejdź do głównej treści

Bezpieczeństwo

WebdriverIO ma na uwadze aspekt bezpieczeństwa przy dostarczaniu rozwiązań. Poniżej znajdują się sposoby na lepsze zabezpieczenie testów.

Najlepsze praktyki

  • Nigdy nie koduj na stałe poufnych danych, które mogą zaszkodzić Twojej organizacji, jeśli zostaną ujawnione w postaci zwykłego tekstu.
  • Użyj mechanizmu (takiego jak vault) do bezpiecznego przechowywania kluczy i haseł oraz pobierania ich podczas uruchamiania testów end-to-end.
  • Sprawdź, czy żadne poufne dane nie są ujawniane w logach i przez dostawcę chmury, takie jak tokeny uwierzytelniania w logach sieciowych.
informacja

Nawet w przypadku danych testowych ważne jest, aby zastanowić się, czy w niewłaściwych rękach złośliwa osoba mogłaby uzyskać informacje lub wykorzystać te zasoby w złych zamiarach.

Maskowanie poufnych danych

Jeśli używasz poufnych danych podczas testu, ważne jest, aby upewnić się, że nie są one widoczne dla wszystkich, na przykład w logach. Ponadto, podczas korzystania z dostawcy chmury często używane są klucze prywatne. Te informacje muszą być zamaskowane w logach, raportach i innych punktach kontaktowych. Poniżej przedstawiono kilka rozwiązań maskowania do uruchamiania testów bez ujawniania tych wartości.

WebDriverIO

Maskowanie wartości tekstowej komend

Komendy addValue i setValue obsługują logiczną wartość mask, aby maskować w logach, a także w raportach. Ponadto inne narzędzia, takie jak narzędzia wydajnościowe i narzędzia innych firm, również otrzymają zamaskowaną wersję, zwiększając bezpieczeństwo.

Na przykład, jeśli używasz prawdziwego użytkownika produkcyjnego i musisz wprowadzić hasło, które chcesz zamaskować, to jest to możliwe w następujący sposób:

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

// Get focus
await passwordInputElement.click();

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

Powyższe ukryje wartość tekstową z logów WDIO w następujący sposób:

Przykład logów:

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

Reportery, takie jak Allure, oraz narzędzia innych firm, jak Percy od BrowserStack, również będą obsługiwać zamaskowaną wersję. W połączeniu z odpowiednią wersją Appium, logi Appium również będą pozbawione poufnych danych.

informacja

Ograniczenia:

  • W Appium dodatkowe wtyczki mogą wyciekać dane, mimo że prosimy o zamaskowanie informacji.
  • Dostawcy chmury mogą używać proxy do logowania HTTP, które omija mechanizm maskowania.
  • Komenda getValue nie jest obsługiwana. Ponadto, jeśli zostanie użyta na tym samym elemencie, może ujawnić wartość, która miała być zamaskowana podczas używania addValue lub setValue.

Minimalne wymagane wersje:

  • WDIO v9.15.0
  • Appium v3.0.0

Maskowanie w logach WDIO

Używając konfiguracji maskingPatterns, możemy maskować poufne informacje z logów WDIO. Jednak logi Appium nie są objęte.

Na przykład, jeśli używasz dostawcy chmury i używasz poziomu info, to najprawdopodobniej "wyciekniesz" klucz użytkownika, jak pokazano poniżej:

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

Aby temu zapobiec, możemy przekazać wyrażenie regularne '--key=([^ ]*)' i teraz w logach zobaczysz

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

Możesz osiągnąć powyższe, dostarczając wyrażenie regularne do pola maskingPatterns konfiguracji.

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
}
}
informacja

Minimalna wymagana wersja:

  • WDIO v9.15.0

Wyłączanie loggerów WDIO

Innym sposobem zablokowania logowania poufnych danych jest obniżenie lub wyciszenie poziomu logowania lub wyłączenie loggera. Można to osiągnąć w następujący sposób:

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);
}
};

Rozwiązania firm trzecich

Appium

Appium oferuje własne rozwiązanie maskowania; zobacz Log filter

  • Korzystanie z ich rozwiązania może być trudne. Jednym ze sposobów, jeśli to możliwe, jest przekazanie tokena w ciągu, takiego jak @mask@ i użycie go jako wyrażenia regularnego
  • W niektórych wersjach Appium wartości są również logowane z każdym znakiem oddzielonym przecinkiem, więc musimy być ostrożni.
  • Niestety, BrowserStack nie obsługuje tego rozwiązania, ale jest ono nadal przydatne lokalnie

Używając przykładu @mask@ wspomnianego wcześniej, możemy użyć następującego pliku JSON o nazwie appiumMaskLogFilters.json

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

Następnie przekaż nazwę pliku JSON do pola logFilters w konfiguracji usługi 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 również oferuje pewien poziom maskowania, aby ukryć niektóre dane; zobacz hide sensitive data

  • Niestety, rozwiązanie jest typu "wszystko albo nic", więc wszystkie wartości tekstowe dostarczonych komend będą zamaskowane.

Welcome! How can I help?

WebdriverIO AI Copilot