| // This tests that HTTPS proxy URLs with invalid credentials (containing \r or \n characters) |
| // are rejected with an appropriate error. |
| import * as common from '../common/index.mjs'; |
| import assert from 'node:assert'; |
| |
| if (!common.hasCrypto) { |
| common.skip('missing crypto'); |
| } |
| |
| // https must be dynamically imported so that builds without crypto support |
| // can skip it. |
| const { default: https } = await import('node:https'); |
| |
| const testCases = [ |
| { |
| name: 'carriage return in username (HTTPS)', |
| proxyUrl: 'https://user\r:pass@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| { |
| name: 'newline in username (HTTPS)', |
| proxyUrl: 'https://user\n:pass@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| { |
| name: 'carriage return in password (HTTPS)', |
| proxyUrl: 'https://user:pass\r@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| { |
| name: 'newline in password (HTTPS)', |
| proxyUrl: 'https://user:pass\n@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| { |
| name: 'CRLF injection attempt in username (HTTPS)', |
| proxyUrl: 'https://user\r\nHost: example.com:pass@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| { |
| name: 'CRLF injection attempt in password (HTTPS)', |
| proxyUrl: 'https://user:pass\r\nHost: example.com@proxy.example.com:8080', |
| expectedError: { code: 'ERR_PROXY_INVALID_CONFIG', message: /Invalid proxy URL/ }, |
| }, |
| ]; |
| |
| for (const testCase of testCases) { |
| // Test that creating an agent with invalid proxy credentials throws an error |
| assert.throws(() => { |
| new https.Agent({ |
| proxyEnv: { |
| HTTPS_PROXY: testCase.proxyUrl, |
| }, |
| }); |
| }, testCase.expectedError); |
| } |