anonymize-query-params.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { diag } from '@opentelemetry/api';
  2. const logger = diag.createComponentLogger({ namespace: 'growi:anonymization:anonymize-query-params' });
  3. /**
  4. * Try to parse JSON array, return null if invalid
  5. */
  6. function tryParseJsonArray(value: string): unknown[] | null {
  7. try {
  8. const parsed = JSON.parse(value);
  9. return Array.isArray(parsed) ? parsed : null;
  10. }
  11. catch {
  12. return null;
  13. }
  14. }
  15. /**
  16. * Anonymize specific query parameters in HTTP target URL
  17. * @param target - The HTTP target URL with query parameters
  18. * @param paramNames - Array of parameter names to anonymize
  19. * @returns Anonymized HTTP target URL
  20. */
  21. export function anonymizeQueryParams(target: string, paramNames: string[]): string {
  22. try {
  23. const url = new URL(target, 'http://localhost');
  24. const searchParams = new URLSearchParams(url.search);
  25. let hasChange = false;
  26. for (const paramName of paramNames) {
  27. // Handle regular parameter (including JSON arrays)
  28. if (searchParams.has(paramName)) {
  29. const value = searchParams.get(paramName);
  30. if (value) {
  31. let replacement = '[ANONYMIZED]';
  32. if (value.startsWith('[') && value.endsWith(']')) {
  33. const jsonArray = tryParseJsonArray(value);
  34. if (jsonArray && jsonArray.length > 0) {
  35. replacement = '["[ANONYMIZED]"]';
  36. }
  37. }
  38. searchParams.set(paramName, replacement);
  39. hasChange = true;
  40. }
  41. }
  42. // Handle array-style parameters (paramName[])
  43. const arrayParam = `${paramName}[]`;
  44. if (searchParams.has(arrayParam)) {
  45. searchParams.delete(arrayParam);
  46. searchParams.set(arrayParam, '[ANONYMIZED]');
  47. hasChange = true;
  48. }
  49. }
  50. return hasChange ? `${url.pathname}?${searchParams.toString()}${url.hash}` : target;
  51. }
  52. catch (error) {
  53. logger.warn(`Failed to anonymize query parameters [${paramNames.join(', ')}]: ${error}`);
  54. return target;
  55. }
  56. }