Files
shopPRO/change.md
Jacek Pyziak 073069c303 fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (v0.353)
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>
2026-05-13 23:10:08 +02:00

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-btn i 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_tags z 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.pl nadal 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

  1. Hard-reload przeglądarki (Ctrl+F5) — stary HTML siedzi w cache klienta.
  2. Restart PHP-FPM / wyczyszczenie OPcache — inaczej stary skompilowany szablon dalej będzie serwowany.