Skip to content

Commit 2592f94

Browse files
OrKoNDevtools-frontend LUCI CQ
authored andcommitted
[DrJones] Implement an allowlist for headers
Fixed: 375118590 Change-Id: Ic42195f9f4d6aaeffa3dc69206c6258709126afe Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5965016 Commit-Queue: Alex Rudenko <[email protected]> Reviewed-by: Mathias Bynens <[email protected]>
1 parent 49481db commit 2592f94

File tree

2 files changed

+128
-22
lines changed

2 files changed

+128
-22
lines changed

front_end/panels/freestyler/DrJonesNetworkAgent.test.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {describeWithMockConnection} from '../../testing/MockConnection.js';
1515
import {createNetworkPanelForMockConnection} from '../../testing/NetworkHelpers.js';
1616
import * as Coordinator from '../../ui/components/render_coordinator/render_coordinator.js';
1717

18-
import {DrJonesNetworkAgent, ResponseType} from './freestyler.js';
18+
import {allowHeader, DrJonesNetworkAgent, ResponseType} from './freestyler.js';
1919

2020
const coordinator = Coordinator.RenderCoordinator.RenderCoordinator.instance();
2121

@@ -146,8 +146,9 @@ describeWithMockConnection('DrJonesNetworkAgent', () => {
146146
'requestId' as Protocol.Network.RequestId, 'https://www.example.com' as Platform.DevToolsPath.UrlString,
147147
'' as Platform.DevToolsPath.UrlString, null, null, null);
148148
selectedNetworkRequest.statusCode = 200;
149-
selectedNetworkRequest.setRequestHeaders([{name: 'foo1', value: 'bar1'}]);
150-
selectedNetworkRequest.responseHeaders = [{name: 'foo2', value: 'bar2'}, {name: 'foo3', value: 'bar3'}];
149+
selectedNetworkRequest.setRequestHeaders([{name: 'content-type', value: 'bar1'}]);
150+
selectedNetworkRequest.responseHeaders =
151+
[{name: 'content-type', value: 'bar2'}, {name: 'x-forwarded-for', value: 'bar3'}];
151152
selectedNetworkRequest.timing = timingInfo;
152153

153154
const initiatorNetworkRequest = SDK.NetworkRequest.NetworkRequest.create(
@@ -222,11 +223,11 @@ describeWithMockConnection('DrJonesNetworkAgent', () => {
222223
details: [
223224
{
224225
title: 'Request',
225-
text: 'Request URL: https://www.example.com\n\nRequest Headers\nfoo1: bar1',
226+
text: 'Request URL: https://www.example.com\n\nRequest Headers\ncontent-type: bar1',
226227
},
227228
{
228229
title: 'Response',
229-
text: 'Response Status: 200 \n\nResponse Headers\nfoo2: bar2\nfoo3: bar3',
230+
text: 'Response Status: 200 \n\nResponse Headers\ncontent-type: bar2\nx-forwarded-for: bar3',
230231
},
231232
{
232233
title: 'Timing',
@@ -245,7 +246,7 @@ describeWithMockConnection('DrJonesNetworkAgent', () => {
245246
{
246247
type: ResponseType.QUERYING,
247248
query:
248-
'# Selected network request \nRequest: https://www.example.com\n\nRequest headers:\nfoo1: bar1\n\nResponse headers:\nfoo2: bar2\nfoo3: bar3\n\nResponse status: 200 \n\nRequest timing:\nQueued at (timestamp): 0 μs\nStarted at (timestamp): 8.3 min\nQueueing (duration): 8.3 min\nConnection start (stalled) (duration): 800.00 ms\nRequest sent (duration): 100.00 ms\nDuration (duration): 8.3 min\n\nRequest initiator chain:\n- URL: https://www.initiator.com\n\t- URL: https://www.example.com\n\t\t- URL: https://www.example.com/1\n\t\t- URL: https://www.example.com/2\n\n# User request\n\ntest',
249+
'# Selected network request \nRequest: https://www.example.com\n\nRequest headers:\ncontent-type: bar1\n\nResponse headers:\ncontent-type: bar2\nx-forwarded-for: bar3\n\nResponse status: 200 \n\nRequest timing:\nQueued at (timestamp): 0 μs\nStarted at (timestamp): 8.3 min\nQueueing (duration): 8.3 min\nConnection start (stalled) (duration): 800.00 ms\nRequest sent (duration): 100.00 ms\nDuration (duration): 8.3 min\n\nRequest initiator chain:\n- URL: https://www.initiator.com\n\t- URL: https://www.example.com\n\t\t- URL: https://www.example.com/1\n\t\t- URL: https://www.example.com/2\n\n# User request\n\ntest',
249250
},
250251
{
251252
type: ResponseType.ANSWER,
@@ -260,11 +261,11 @@ describeWithMockConnection('DrJonesNetworkAgent', () => {
260261
text: `# Selected network request \nRequest: https://www.example.com
261262
262263
Request headers:
263-
foo1: bar1
264+
content-type: bar1
264265
265266
Response headers:
266-
foo2: bar2
267-
foo3: bar3
267+
content-type: bar2
268+
x-forwarded-for: bar3
268269
269270
Response status: 200 \n
270271
Request timing:
@@ -292,4 +293,16 @@ test`,
292293
]);
293294
});
294295
});
296+
297+
describe('allowHeader', () => {
298+
it('allows a header from the list', () => {
299+
assert.isTrue(allowHeader({name: 'content-type', value: 'foo'}));
300+
});
301+
302+
it('disallows headers not on the list', () => {
303+
assert.isFalse(allowHeader({name: 'cookie', value: 'foo'}));
304+
assert.isFalse(allowHeader({name: 'set-cookie', value: 'foo'}));
305+
assert.isFalse(allowHeader({name: 'authorization', value: 'foo'}));
306+
});
307+
});
295308
});

front_end/panels/freestyler/DrJonesNetworkAgent.ts

Lines changed: 106 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -159,20 +159,113 @@ function formatLines(title: string, lines: string[], maxLength: number): string
159159
return result && title ? title + '\n' + result : result;
160160
}
161161

162+
// Header names that could be included in the prompt, lowercase.
163+
const allowedHeaders = new Set([
164+
'a-im',
165+
'accept-ch',
166+
'accept-charset',
167+
'accept-datetime',
168+
'accept-encoding',
169+
'accept-language',
170+
'accept-patch',
171+
'accept-ranges',
172+
'accept',
173+
'access-control-allow-credentials',
174+
'access-control-allow-headers',
175+
'access-control-allow-methods',
176+
'access-control-allow-origin',
177+
'access-control-expose-headers',
178+
'access-control-max-age',
179+
'access-control-request-headers',
180+
'access-control-request-method',
181+
'age',
182+
'allow',
183+
'alt-svc',
184+
'cache-control',
185+
'connection',
186+
'content-disposition',
187+
'content-encoding',
188+
'content-language',
189+
'content-length',
190+
'content-location',
191+
'content-md5',
192+
'content-range',
193+
'content-security-policy',
194+
'content-type',
195+
'correlation-id',
196+
'date',
197+
'delta-base',
198+
'dnt',
199+
'etag',
200+
'expect-ct',
201+
'expect',
202+
'expires',
203+
'forwarded',
204+
'front-end-https',
205+
'host',
206+
'http2-settings',
207+
'if-match',
208+
'if-modified-since',
209+
'if-none-match',
210+
'if-range',
211+
'if-unmodified-source',
212+
'im',
213+
'last-modified',
214+
'link',
215+
'location',
216+
'max-forwards',
217+
'nel',
218+
'origin',
219+
'permissions-policy',
220+
'pragma',
221+
'preference-applied',
222+
'proxy-connection',
223+
'public-key-pins',
224+
'range',
225+
'referer',
226+
'refresh',
227+
'report-to',
228+
'retry-after',
229+
'save-data',
230+
'sec-gpc',
231+
'server',
232+
'status',
233+
'strict-transport-security',
234+
'te',
235+
'timing-allow-origin',
236+
'tk',
237+
'trailer',
238+
'transfer-encoding',
239+
'upgrade-insecure-requests',
240+
'upgrade',
241+
'user-agent',
242+
'vary',
243+
'via',
244+
'warning',
245+
'www-authenticate',
246+
'x-att-deviceid',
247+
'x-content-duration',
248+
'x-content-security-policy',
249+
'x-content-type-options',
250+
'x-correlation-id',
251+
'x-forwarded-for',
252+
'x-forwarded-host',
253+
'x-forwarded-proto',
254+
'x-frame-options',
255+
'x-http-method-override',
256+
'x-powered-by',
257+
'x-redirected-by',
258+
'x-request-id',
259+
'x-requested-with',
260+
'x-ua-compatible',
261+
'x-uidh',
262+
'x-wap-profile',
263+
'x-webkit-csp',
264+
'x-xss-protection',
265+
]);
266+
162267
export function allowHeader(header: SDK.NetworkRequest.NameValue): boolean {
163-
const normalizedName = header.name.toLowerCase().trim();
164-
// Skip custom headers.
165-
if (normalizedName.startsWith('x-')) {
166-
return false;
167-
}
168-
// Skip cookies as they might contain auth.
169-
if (normalizedName === 'cookie' || normalizedName === 'set-cookie') {
170-
return false;
171-
}
172-
if (normalizedName === 'authorization') {
173-
return false;
174-
}
175-
return true;
268+
return allowedHeaders.has(header.name.toLowerCase().trim());
176269
}
177270

178271
export function formatHeaders(title: string, headers: SDK.NetworkRequest.NameValue[]): string {

0 commit comments

Comments
 (0)