Kategorie Chyby

Zde jsou zobrazeny pouze příspěvky, které spadají do kategorie Chyby.

Václav Ambrož

Chyba v OpenCart instalátoru

Pokud při instalaci OpenCartu narazíte na varování typu:

Warning: open_basedir needs to allow access to /home/www/example.com/www/opencart/

přestože máte open_basedir správně nastavený, pravděpodobně nejde o chybu v PHP konfiguraci, ale o bug přímo v instalačním skriptu OpenCartu.

Co je open_basedir a proč na něm instalátor padá

Direktiva open_basedir v PHP omezuje, do jakých adresářů může PHP skript přistupovat. Správné nastavení může například vypadat takto:

open_basedir = /home/www/tmp:/home/www/example.com/www:/etc/ssl/certs:/usr/share/php

Toto říká PHP, že může pracovat pouze s těmito cestami. Pokud zkusí přistoupit jinam, dostane chybu typu open_basedir restriction in effect.

OpenCart při instalaci kontroluje, zda je cesta instalace v rámci povolených adresářů. Bohužel v některých verzích (např. 4.x a část 3.x) je tato kontrola chybně implementovaná.

Kde je chyba v kódu

V souboru:

install/controller/install/step_2.php

se používá tento kód:

$directories = explode(',', $open_basedir, 1);

foreach ($directories as $directory) {
if (str_starts_with($directory, $required)) {
$data['open_basedir'] = true;
}
}

To má hned dva problémy:

  1. na Linuxu se open_basedir odděluje dvojtečkou (:), ne čárkou
  2. parametr 1 znamená, že se použije jen první hodnota – ostatní cesty se ignorují

Výsledkem je, že test selže, i když je cesta správně povolená. PHP samotné přístup neblokuje, ale OpenCart instalátor si myslí, že ano.

Možnosti řešení

  1. dočasně vypnout open_basedir při instalaci (pokud máte přístup k PHP konfiguraci), po instalaci OpenCart už open_basedir dále nekontroluje
  2. pokud chcete mít kontrolu funkční i při zapnuté ochraně a udělat rychlý bugfix, upravte část kódu v souboru install/controller/install/step_2.php následovně:

    $directories = explode(‚,‘, $open_basedir, 1);

    Nahraďte za:

    // Correct parsing of open_basedir (supports ":" on Linux and ";" on Windows)
    $directories = preg_split('/[:;,]/', $open_basedir);

    foreach ($directories as $directory) {
    $directory = rtrim($directory, '/');
    if (str_starts_with($required, $directory)) {
    $data['open_basedir'] = true;
    break;
    }
    }

    Stejnou úpravu proveďte i v metodě save() v tom samém souboru.

Publikováno 06.10 2025 v 10:52 hod. | Kategorie: Chyby

Změna v ACF Pluginu 6.2.5

V nedávné aktualizaci pluginu Advanced Custom Fields (ACF) došlo k významné změně, která ovlivňuje způsob zobrazení obsahu z ACF polí ve WordPress šablonách. Tato verze zavádí automatické escapování HTML z obsahu vypsaného funkcemi the_field a the_sub_field, což má za cíl zvýšit bezpečnost tím, že se zabrání potenciálním XSS útokům. Tato změna může ovlivnit stránky, které vkládají HTML nebo JavaScript přímo z ACF polí. Změny jsou detailněji popsány tady.

Chyba

V tomto směru se tak může začít v administraci WordPressu zobrazovat chyba typu:

ACF — ACF now automatically escapes unsafe HTML when rendered by the_field or the ACF shortcode. We’ve detected the output of some of your fields has been modified by this change, but this may not be a breaking change.

Příklad změny kódu

Pokud se vás tento problém týká, je možnou alternativou nahradit původní kód, který mohl vypadat třeba takto:

<?php the_field('kod_formulare'); ?>

Za:

<?php echo get_field('kod_formulare', false, false); ?>

Závěrem

Tato změna tedy znamená, že je potřeba být opatrnější při vkládání obsahu, který může obsahovat HTML nebo JavaScript kód, a zvážit alternativní metody pro jeho bezpečné zobrazení.

Publikováno 29.02 2024 v 09:53 hod. | Kategorie: Chyby

Aktualizace pluginu Carousel Slider

Setkal jsem se s problémy s aktualizací pluginu Carousel Slider z verze 2.2.6 na 2.2.7, kdy to kompletně rozhodí weby nebo samotné galerie. Zatím jsem blíže nezkoumal veškeré změny, ale doporučuji případně si na tuto aktualizaci dát pozor.

Jak zakázat aktualizaci

Je běžné, že se v dnešní době již pluginy aktualizují automaticky a většinou to nejde ani jednoduše vypnout v administraci WordPressu.

Pokud aktualizaci nechcete zakazovat přímo přidáním/editací kódu, tak existuje celá řada pluginů, které dokážou konkrétní aktualizaci zakázat. Využít lze např. Block Plugin Update, kde lze přímo vybrat jen konkrétní plugin, který se nemá aktualizovat.

Moje opatření

U webů, o které se starám, jsem zatím tuto aktualizaci zakázal a plugin obnovil ze zálohy v původní verzi.

Publikováno 28.02 2024 v 12:13 hod. | Kategorie: Chyby