diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php index c0ee90d66f..54014adf7a 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php @@ -226,7 +226,12 @@ public function addItemAction(Request $request): Response $this->denyAccessUnlessGranted('CORESHOP_CART'); $this->denyAccessUnlessGranted('CORESHOP_CART_ADD_ITEM'); - $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_index')); + $defaultRedirectGet = $this->generateUrl('coreshop_index'); + $redirect = $this->validateRedirectUrl( + $request, + (string) $this->getParameterFromRequest($request, '_redirect', $defaultRedirectGet), + $defaultRedirectGet, + ); $product = $this->container->get('coreshop.repository.stack.purchasable')->find($this->getParameterFromRequest($request, 'product')); @@ -249,7 +254,12 @@ public function addItemAction(Request $request): Response $form = $this->container->get('form.factory')->createNamed('coreshop-' . $product->getId(), AddToCartType::class, $addToCart); if ($request->isMethod('POST')) { - $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_cart_summary')); + $defaultRedirectPost = $this->generateUrl('coreshop_cart_summary'); + $redirect = $this->validateRedirectUrl( + $request, + (string) $this->getParameterFromRequest($request, '_redirect', $defaultRedirectPost), + $defaultRedirectPost, + ); $form->handleRequest($request); diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php index 05e663e091..db8b01d105 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php @@ -194,8 +194,14 @@ public function addressAction(Request $request): Response $this->fireEvent($request, $address, sprintf('%s.%s.%s_post', 'coreshop', 'address', $eventType)); $this->addFlash('success', $this->container->get('translator')->trans(sprintf('coreshop.ui.customer.address_successfully_%s', $eventType === 'add' ? 'added' : 'updated'))); + $defaultRedirect = $this->generateUrl('coreshop_customer_addresses'); + return $this->redirect( - $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_addresses')), + $this->validateRedirectUrl( + $request, + (string) $this->getParameterFromRequest($request, '_redirect', $defaultRedirect), + $defaultRedirect, + ), ); } } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/FrontendController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/FrontendController.php index 8b067b0058..c75859e3e7 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/FrontendController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/FrontendController.php @@ -19,6 +19,7 @@ namespace CoreShop\Bundle\FrontendBundle\Controller; use CoreShop\Bundle\FrontendBundle\TemplateConfigurator\TemplateConfiguratorInterface; +use CoreShop\Bundle\ResourceBundle\Controller\RedirectUrlValidationTrait; use CoreShop\Component\Core\Context\ShopperContextInterface; use CoreShop\Component\Order\Context\CartContextInterface; use CoreShop\Component\SEO\SEOPresentationInterface; @@ -29,6 +30,8 @@ abstract class FrontendController extends AbstractController { + use RedirectUrlValidationTrait; + public function __construct( \Psr\Container\ContainerInterface $container, ) { diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php index 3db01284a2..caca6b4dc4 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php @@ -50,7 +50,12 @@ public function registerAction(Request $request): Response $form = $this->container->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->container->get('coreshop.factory.customer')->createNew()); - $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile')); + $defaultRedirect = $this->generateUrl('coreshop_customer_profile'); + $redirect = $this->validateRedirectUrl( + $request, + (string) $this->getParameterFromRequest($request, '_redirect', $defaultRedirect), + $defaultRedirect, + ); if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { $form = $form->handleRequest($request); diff --git a/src/CoreShop/Bundle/ResourceBundle/Controller/RedirectUrlValidationTrait.php b/src/CoreShop/Bundle/ResourceBundle/Controller/RedirectUrlValidationTrait.php new file mode 100644 index 0000000000..e866d84590 --- /dev/null +++ b/src/CoreShop/Bundle/ResourceBundle/Controller/RedirectUrlValidationTrait.php @@ -0,0 +1,85 @@ +getHost())) { + return $url; + } + + return $default; + } +} diff --git a/src/CoreShop/Bundle/StorageListBundle/Controller/StorageListController.php b/src/CoreShop/Bundle/StorageListBundle/Controller/StorageListController.php index 2c836cba52..c3cc4f34f1 100644 --- a/src/CoreShop/Bundle/StorageListBundle/Controller/StorageListController.php +++ b/src/CoreShop/Bundle/StorageListBundle/Controller/StorageListController.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\StorageListBundle\Controller; +use CoreShop\Bundle\ResourceBundle\Controller\RedirectUrlValidationTrait; use CoreShop\Component\Resource\Model\ResourceInterface; use CoreShop\Component\Resource\Repository\RepositoryInterface; use CoreShop\Component\StorageList\Context\StorageListContextInterface; @@ -45,6 +46,8 @@ class StorageListController extends AbstractController { + use RedirectUrlValidationTrait; + public function __construct( ContainerInterface $container, protected string $identifier, @@ -85,7 +88,12 @@ public function addItemAction(Request $request): Response $this->denyAccessUnlessGranted($privilege); $this->denyAccessUnlessGranted($privilegeAdd); - $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl($this->summaryRoute)); + $defaultRedirect = $this->generateUrl($this->summaryRoute); + $redirect = $this->validateRedirectUrl( + $request, + (string) $this->getParameterFromRequest($request, '_redirect', $defaultRedirect), + $defaultRedirect, + ); $product = $this->productRepository->find($this->getParameterFromRequest($request, 'product')); $storageList = $this->context->getStorageList();