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.