File tree Expand file tree Collapse file tree 3 files changed +38
-2
lines changed
src/PhpSpreadsheet/Writer
tests/PhpSpreadsheetTests/Writer/Html Expand file tree Collapse file tree 3 files changed +38
-2
lines changed Original file line number Diff line number Diff line change @@ -5,14 +5,15 @@ All notable changes to this project will be documented in this file.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com )
66and this project adheres to [ Semantic Versioning] ( https://semver.org ) .
77
8- # TBD - 2.1.7
8+ # 2025-01-11 - 2.1.7
99
1010### Deprecated
1111
1212- Worksheet::getHashCode is no longer needed..
1313
1414### Fixed
1515
16+ - Backported security patch for Html navigation.
1617- Change hash code for worksheet. Backport of [ PR #4207 ] ( https://github.com/PHPOffice/PhpSpreadsheet/pull/4207 )
1718- Retitling cloned worksheets. Backport of [ PR #4302 ] ( https://github.com/PHPOffice/PhpSpreadsheet/pull/4302 )
1819
Original file line number Diff line number Diff line change @@ -544,7 +544,7 @@ public function generateNavigation(): string
544544 $ html .= '<ul class="navigation"> ' . PHP_EOL ;
545545
546546 foreach ($ sheets as $ sheet ) {
547- $ html .= ' <li class="sheet ' . $ sheetId . '"><a href="#sheet ' . $ sheetId . '"> ' . $ sheet ->getTitle () . '</a></li> ' . PHP_EOL ;
547+ $ html .= ' <li class="sheet ' . $ sheetId . '"><a href="#sheet ' . $ sheetId . '"> ' . htmlspecialchars ( $ sheet ->getTitle () ) . '</a></li> ' . PHP_EOL ;
548548 ++$ sheetId ;
549549 }
550550
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ namespace PhpOffice \PhpSpreadsheetTests \Writer \Html ;
6+
7+ use PhpOffice \PhpSpreadsheet \Spreadsheet ;
8+ use PhpOffice \PhpSpreadsheet \Writer \Html as HtmlWriter ;
9+ use PHPUnit \Framework \TestCase ;
10+
11+ class NavigationBadTitleTest extends TestCase
12+ {
13+ public function testNavigationTitle (): void
14+ {
15+ $ spreadsheet = new Spreadsheet ();
16+ $ sheet = $ spreadsheet ->getActiveSheet ();
17+ $ sheet ->getCell ('A1 ' )->setValue (1 );
18+ $ sheet2 = $ spreadsheet ->createSheet ();
19+ $ sheet2 ->setTitle ('<img src=x onerror=alert(1)> ' );
20+ $ sheet2 ->getCell ('A2 ' )->setValue (2 );
21+
22+ $ writer = new HtmlWriter ($ spreadsheet );
23+ $ writer ->writeAllSheets ();
24+ $ html = $ writer ->generateHTMLAll ();
25+ $ expected = '<ul class="navigation"> '
26+ . PHP_EOL
27+ . ' <li class="sheet0"><a href="#sheet0">Worksheet</a></li> '
28+ . PHP_EOL
29+ . ' <li class="sheet1"><a href="#sheet1"><img src=x onerror=alert(1)></a></li> '
30+ . PHP_EOL
31+ . '</ul> ' ;
32+ self ::assertStringContainsString ($ expected , $ html , 'appropriate characters are escaped ' );
33+ $ spreadsheet ->disconnectWorksheets ();
34+ }
35+ }
You can’t perform that action at this time.
0 commit comments