Skip to content

Commit 098b848

Browse files
committed
Backported Security Patch
1 parent 345e7f0 commit 098b848

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com)
66
and this project adheres to [Semantic Versioning](https://semver.org).
77

8-
# TBD - 2.3.6
8+
# 2025-01=11 - 2.3.6
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

src/PhpSpreadsheet/Writer/Html.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ public function generateNavigation(): string
550550
$html .= '<ul class="navigation">' . PHP_EOL;
551551

552552
foreach ($sheets as $sheet) {
553-
$html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL;
553+
$html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . htmlspecialchars($sheet->getTitle()) . '</a></li>' . PHP_EOL;
554554
++$sheetId;
555555
}
556556

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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">&lt;img src=x onerror=alert(1)&gt;</a></li>'
30+
. PHP_EOL
31+
. '</ul>';
32+
self::assertStringContainsString($expected, $html, 'appropriate characters are escaped');
33+
$spreadsheet->disconnectWorksheets();
34+
}
35+
}

0 commit comments

Comments
 (0)