Zdalny changelog z shoppro.project-dc.pl/updates/changelog.php zwracal niezbalansowany HTML (niezamkniety <script>/<style>/<textarea>/<!--), ktory "polykal" reszte dokumentu - inline-script z handlerami #confirm/#confirmUpdateAll i footer-script z main-layout.php (#clear-cache-btn) nigdy nie parsowaly sie jako JS. Klienci nie mogli aktualizowac shopPRO. Fix w admin/templates/update/main-view.php: 1. Blok <script> z handlerami przeniesiony PRZED sekcje Changelog - handlery podpinaja sie niezaleznie od zdalnego HTML. 2. Sanityzacja zdalnego changeloga: preg_replace usuwa komentarze HTML, strip_tags z whitelista (<p><br><b><strong><i><em><u><ul><ol><li> <h1>-<h6><span><div><a><pre><code><hr>) wycina tagi strukturalne i wykonywalne (<script>, <style>, <iframe>, <textarea>). Skutek uboczny: footer-script z main-layout.php (Wyczysc cache + globalne wyszukiwanie + sprawdzanie aktualizacji) dziala teraz na podstronie update. Po wgraniu na instancje: hard-reload (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache. Suita PHPUnit: 846 testow / 2348 assertions OK. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.3 KiB
Zmiana 3: Naprawa JS na stronie /admin/update/main_view/ (przyciski aktualizacji + Wyczyść cache)
Plik
admin/templates/update/main-view.php
Problem
Na podstronie /admin/update/main_view/ nie działały:
- przycisk „Aktualizuj do wyższej wersji" (
#confirm) - przycisk „Aktualizuj do najwyższej wersji" (
#confirmUpdateAll) - globalny przycisk „Wyczyść cache" (
#clear-cache-btn) z headera admina
W konsoli przeglądarki nie było żadnego błędu JS. Kliknięcie powodowało jedynie dopisanie # do URL-a (/admin/update/main_view/#).
Przyczyna
W szablonie znajdowało się pobieranie zdalnego changeloga przez file_get_contents z https://shoppro.project-dc.pl/updates/changelog.php:
<?= @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver ); ?>
Odpowiedź zdalnego serwera zawierała niezbalansowany HTML (np. niezamknięty <script>, <!--, <style> albo <textarea>), który „połykał" całą resztę dokumentu jako tekst wewnątrz tego nieparzystego tagu. Skutki:
- Inline-script z handlerami przycisków aktualizacji (zaraz pod changelogiem) nie był parsowany jako JS.
- Footer-script z
main-layout.php(handler#clear-cache-btni globalne wyszukiwanie) też był „w środku" połkniętego HTML i nigdy się nie uruchamiał na tej podstronie. - Konsola nie pokazywała błędu, bo to nie był błąd JS — to był po prostu HTML, który nigdy nie został wykonany jako skrypt.
Co zmieniono
1. Blok <script> z handlerami przeniesiony przed sekcję Changelog
Wcześniej kolejność w szablonie była: panel z wersjami → log → changelog (zdalny) → <script>. Po zmianie: panel z wersjami → log → <script> → changelog (zdalny). Dzięki temu handlery #confirm i #confirmUpdateAll podpinają się niezależnie od tego, co zwróci zdalny serwer.
2. Sanitizacja odpowiedzi zdalnego changeloga
Przed wyrenderowaniem changelog jest czyszczony:
$changelog = (string) @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver );
$changelog = preg_replace( '/<!--.*?-->/s', '', $changelog );
$changelog = strip_tags( $changelog, '<p><br><b><strong><i><em><u><ul><ol><li><h1><h2><h3><h4><h5><h6><span><div><a><pre><code><hr>' );
echo $changelog;
- Usuwane są komentarze HTML (
<!--…-->). strip_tagsz wąską białą listą zostawia tylko tagi formatujące — wszystkie tagi strukturalne i mogące „połknąć" treść (<script>,<style>,<textarea>,<iframe>,<body>,</html>itp.) są usuwane.
3. Naprawiony też skutek uboczny
Po tych zmianach poprawnie działa również:
- footer-script z
main-layout.php(przycisk Wyczyść cache + globalne wyszukiwanie produktów/zamówień + sprawdzanie aktualizacji w menu)
Efekt
- Przyciski aktualizacji systemu na
/admin/update/main_view/działają. - Przycisk „Wyczyść cache" działa na tej (i każdej innej) podstronie admina.
- Zdalny changelog ze
shoppro.project-dc.plnadal się wyświetla, ale nie może już popsuć struktury strony. - Dodatkowy zysk bezpieczeństwa: zdalny serwis nie może wstrzyknąć JS w panel admina.
Po wgraniu
- Hard-reload przeglądarki (Ctrl+F5) — stary HTML siedzi w cache klienta.
- Restart PHP-FPM / wyczyszczenie OPcache — inaczej stary skompilowany szablon dalej będzie serwowany.