Pereiti prie turinio
← Visos PrestaShop 9 klaidos

PrestaShop 9 klaidos

403 Forbidden modulio ajax.php faile PrestaShop 9 versijoje

PrestaShop 9 blokuoja tiesioginę prieigą prie PHP failų modulių aplanke. Moduliai, atsakantys į AJAX per savo ajax.php, gauna 403 Forbidden, o funkcija nustoja veikti.

Klaida
403 Forbidden: /modules/mymodule/ajax.php
Pašalinta
PrestaShop 9.0
Dažniausiai randama
Senesni moduliai su savais PHP failais

Kas nutiko

PrestaShop 9 prideda modules/.htaccess failą, kuris draudžia tiesiogiai iš interneto atidaryti .php, .tpl, .twig, .json, .yml, .log, .txt ir config.xml failus modulių aplanke. Taip uždaroma sena saugumo spraga: daug atakų prieš PrestaShop parduotuves vyko per pamirštus PHP skriptus modulių aplankuose.

Šalutinis poveikis: moduliai, atsakantys per savo failą, pavyzdžiui, modules/mymodule/ajax.php, cron.php ar upload.php, dabar gauna 403 Forbidden. PHP klaidos nėra, PrestaShop žurnale irgi nieko. Mygtukas ar filtras tiesiog nieko nedaro, o naršyklės kūrėjo įrankiai rodo 403 atsakymą.

Tai galioja Apache serveriui. Nginx šią taisyklę reikia įrašyti į serverio konfigūraciją, todėl ten tie patys moduliai gali vis dar veikti – kartu su saugumo spraga.

Sprendimas

Perkelkite atsakymą į modulio front valdiklį. Tai standartinis būdas nuo PrestaShop 1.5, todėl veikia visose versijose:

// modules/mymodule/controllers/front/ajax.php
class MyModuleAjaxModuleFrontController extends ModuleFrontController
{
    public function postProcess()
    {
        $result = ['ok' => true];
        $this->ajaxRender(json_encode($result));
        exit;
    }
}

Jo adresą kurkite per nuorodų klasę, o ne įrašykite kelią ranka:

$url = $this->context->link->getModuleLink('mymodule', 'ajax', [], true);

Cron skriptai irgi tampa front valdikliu, apsaugotu slaptu raktu adrese.

Netrinkite ir nesilpninkite modules/.htaccess, kad senas failas vėl veiktų. Kitas atnaujinimas jį atkurs, ir jis ten ne veltui.

Kur dar slepiasi

find modules -maxdepth 2 -name "*.php" ! -name "index.php" | grep -v "/vendor/"

Tada patikrinkite, kuriuos iš tų failų modulis kviečia iš JavaScript ar cron užduoties. Pagrindinis modulio failas (mymodule.php) tvarkoje – jis niekada neatidaromas tiesiogiai.

Raskite visas tokias vietas prieš atnaujindami

Kur yra vienas pašalintas kvietimas, paprastai yra ir daugiau. Mūsų nemokama PrestaShop 9 parengties patikra perskaito visų modulių, temos ir override failų kodą ir parodo kiekvieną problemą su failu ir eilute. Ji tik skaito, nieko nekeičia.

Gauti nemokamą patikrą

Nenorite taisyti patys? Parduotuves į PrestaShop 9 atnaujiname už fiksuotą kainą. Apie atnaujinimą