Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: tests/html/node_validator_test.dart

Issue 1077813002: Check for DOM clobbering attacks in sanitizing/node validation (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tests/html/html.status ('k') | tools/dom/src/Validators.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library validator_test; 5 library validator_test;
6 6
7 import 'dart:async';
8 import 'dart:html'; 7 import 'dart:html';
9 import 'dart:svg' as svg; 8 import 'dart:svg' as svg;
10 import 'package:unittest/unittest.dart'; 9 import 'package:unittest/unittest.dart';
11 import 'package:unittest/html_individual_config.dart'; 10 import 'package:unittest/html_individual_config.dart';
12 import 'utils.dart'; 11 import 'utils.dart';
13 12
14 13
15 var nullSanitizer = new NullTreeSanitizer(); 14 var nullSanitizer = new NullTreeSanitizer();
16 15
17 void validateHtml(String html, String reference, NodeValidator validator) { 16 void validateHtml(String html, String reference, NodeValidator validator) {
18 var a = document.body.createFragment(html, validator: validator); 17 var a = document.body.createFragment(html, validator: validator);
19 var b = document.body.createFragment(reference, 18 var b = document.body.createFragment(reference,
20 treeSanitizer: nullSanitizer); 19 treeSanitizer: nullSanitizer);
21 20
21 // Prevent a false pass when both the html and the reference both get entirely
22 // deleted, which is technically a match, but unlikely to be what we meant.
23 if (reference != '') {
24 expect(b.childNodes.length > 0, isTrue);
25 }
22 validateNodeTree(a, b); 26 validateNodeTree(a, b);
23 } 27 }
24 28
25 class RecordingUriValidator implements UriPolicy { 29 class RecordingUriValidator implements UriPolicy {
26 final List<String> calls = <String>[]; 30 final List<String> calls = <String>[];
27 31
28 bool allowsUri(String uri) { 32 bool allowsUri(String uri) {
29 calls.add('$uri'); 33 calls.add('$uri');
30 return false; 34 return false;
31 } 35 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 var template = fragment.nodes.single; 128 var template = fragment.nodes.single;
125 129
126 var expectedContent = document.body.createFragment( 130 var expectedContent = document.body.createFragment(
127 '<div></div>' 131 '<div></div>'
128 '<img/>'); 132 '<img/>');
129 133
130 validateNodeTree(template.content, expectedContent); 134 validateNodeTree(template.content, expectedContent);
131 }); 135 });
132 }); 136 });
133 137
134 group('URI sanitization', () { 138 group('URI_sanitization', () {
135 var recorder = new RecordingUriValidator(); 139 var recorder = new RecordingUriValidator();
136 var validator = new NodeValidatorBuilder()..allowHtml5(uriPolicy: recorder); 140 var validator = new NodeValidatorBuilder()..allowHtml5(uriPolicy: recorder);
137 141
138 checkUriPolicyCalls(String name, String html, String reference, 142 checkUriPolicyCalls(String name, String html, String reference,
139 List<String> expectedCalls) { 143 List<String> expectedCalls) {
140 144
141 test(name, () { 145 test(name, () {
142 recorder.reset(); 146 recorder.reset();
143 147
144 validateHtml(html, reference, validator); 148 validateHtml(html, reference, validator);
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 '<svg xmlns="http://www.w3.org/2000/svg' 351 '<svg xmlns="http://www.w3.org/2000/svg'
348 'xmlns:xlink="http://www.w3.org/1999/xlink">' 352 'xmlns:xlink="http://www.w3.org/1999/xlink">'
349 '<image xlink:href="foo" data-foo="bar"/>' 353 '<image xlink:href="foo" data-foo="bar"/>'
350 '</svg>'); 354 '</svg>');
351 355
352 testHtml('blocks script elements', 356 testHtml('blocks script elements',
353 validator, 357 validator,
354 '<svg xmlns="http://www.w3.org/2000/svg>' 358 '<svg xmlns="http://www.w3.org/2000/svg>'
355 '<script></script>' 359 '<script></script>'
356 '</svg>', 360 '</svg>',
357 '<svg xmlns="http://www.w3.org/2000/svg></svg>'); 361 '');
362
363 testHtml('blocks script elements but allows other',
364 validator,
365 '<svg xmlns="http://www.w3.org/2000/svg>'
366 '<script></script><ellipse cx="200" cy="80" rx="100" ry="50"></ellipse>'
367 '</svg>',
368 '<svg xmlns="http://www.w3.org/2000/svg>'
369 '<ellipse cx="200" cy="80" rx="100" ry="50"></ellipse>'
370 '</svg>');
358 371
359 testHtml('blocks script handlers', 372 testHtml('blocks script handlers',
360 validator, 373 validator,
361 '<svg xmlns="http://www.w3.org/2000/svg' 374 '<svg xmlns="http://www.w3.org/2000/svg'
362 'xmlns:xlink="http://www.w3.org/1999/xlink">' 375 'xmlns:xlink="http://www.w3.org/1999/xlink">'
363 '<image xlink:href="foo" onerror="something"/>' 376 '<image xlink:href="foo" onerror="something"/>'
364 '</svg>', 377 '</svg>',
365 '<svg xmlns="http://www.w3.org/2000/svg' 378 '<svg xmlns="http://www.w3.org/2000/svg'
366 'xmlns:xlink="http://www.w3.org/1999/xlink">' 379 'xmlns:xlink="http://www.w3.org/1999/xlink">'
367 '<image xlink:href="foo"/>' 380 '<image xlink:href="foo"/>'
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 'xmlns:xlink="http://www.w3.org/1999/xlink">' 462 'xmlns:xlink="http://www.w3.org/1999/xlink">'
450 '<image xlink:href="foo" data-foo="bar"/>' 463 '<image xlink:href="foo" data-foo="bar"/>'
451 '</svg>'; 464 '</svg>';
452 465
453 var fragment = new DocumentFragment.svg(svgText); 466 var fragment = new DocumentFragment.svg(svgText);
454 var element = fragment.nodes.first; 467 var element = fragment.nodes.first;
455 expect(element is svg.SvgSvgElement, isTrue); 468 expect(element is svg.SvgSvgElement, isTrue);
456 expect(element.children[0] is svg.ImageElement, isTrue); 469 expect(element.children[0] is svg.ImageElement, isTrue);
457 }); 470 });
458 }); 471 });
472
473 group('dom_clobbering', () {
474 var validator = new NodeValidatorBuilder.common();
475
476 testHtml('DOM clobbering of attributes with single node',
477 validator,
478 "<form onmouseover='alert(1)'><input name='attributes'>",
479 "");
480
481 testHtml('DOM clobbering of attributes with multiple nodes',
482 validator,
483 "<form onmouseover='alert(1)'><input name='attributes'>"
484 "<input name='attributes'>",
485 "");
486
487 testHtml('DOM clobbering of lastChild',
488 validator,
489 "<form><input name='lastChild'><input onmouseover='alert(1)'>",
490 "");
491
492 testHtml('DOM clobbering of both children and lastChild',
493 validator,
494 "<form><input name='lastChild'><input name='children'>"
495 "<input id='children'><input onmouseover='alert(1)'>",
496 "");
497
498 testHtml('DOM clobbering of both children and lastChild, different order',
499 validator,
500 "<form><input name='children'><input name='children'>"
501 "<input id='children' name='lastChild'>"
502 "<input id='bad' onmouseover='alert(1)'>",
503 "");
504
505 testHtml('tagName makes containing form invalid',
506 validator,
507 "<form onmouseover='alert(2)'><input name='tagName'>",
508 "");
509
510 testHtml('tagName without mouseover',
511 validator,
512 "<form><input name='tagName'>",
513 "");
514 });
459 } 515 }
OLDNEW
« no previous file with comments | « tests/html/html.status ('k') | tools/dom/src/Validators.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698