Skip to content

Commit 396d46a

Browse files
committed
MAGE-1381 Add XSS protection with SecureHtmlRenderer for PHPCS
1 parent c690b13 commit 396d46a

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed
Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,53 @@
11
<?php
22

33
/** @var \Algolia\AlgoliaSearch\Block\Configuration $block */
4+
/** @var \Magento\Framework\Escaper $escaper */
45

56
$configuration = $block->getConfiguration();
67

8+
// Escape untrusted input (escape inline for PHPCS where possible)
9+
$instantSearchHideCss = $escaper->escapeHtml($configuration['instant']['selector']) . ' {display:none}';
10+
711
if (class_exists('\Magento\Framework\View\Helper\SecureHtmlRenderer')): ?>
812
<?php
9-
/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
13+
/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
1014
if ($block->canLoadInstantSearch()) {
11-
$css = /* @noEscape */ $secureRenderer->renderTag('style', [], $configuration['instant']['selector'] . ' {display:none}', false);
12-
/* @noEscape */ echo $secureRenderer->renderTag('script', [], 'document.write(\'' . $css . '\');', false);
15+
$styleElement = $secureRenderer->renderTag('style', [], $instantSearchHideCss, false);
16+
/** SecureHtmlRenderer::renderTag yields a false positive on PHPCS */
17+
echo /** phpcs:ignore Magento2.Security.EscapeOutput.OutputNotEscaped */
18+
$secureRenderer->renderTag(
19+
'script',
20+
[],
21+
'document.write(\'' . $escaper->escapeJs($styleElement) . '\');',
22+
false
23+
);
1324
}
1425
?>
1526

16-
<?= /* @noEscape */ $secureRenderer->renderTag('script', [], "window.algoliaConfig = " . json_encode($configuration) . ';', false); ?>
27+
<?=
28+
/**
29+
* SecureHtmlRenderer::renderTag yields a false positive on PHPCS
30+
* phpcs:ignore Magento2.Security.EscapeOutput.OutputNotEscaped
31+
*/
32+
$secureRenderer->renderTag(
33+
'script',
34+
[],
35+
"window.algoliaConfig = JSON.parse('" . $escaper->escapeJs(json_encode($configuration)) . "')",
36+
false
37+
)
38+
?>
1739
<?php else: ?>
1840
<script>
1941
<?php
2042
if ($block->canLoadInstantSearch()):
21-
$css = '<style type="text/css">' . $configuration['instant']['selector'] . ' {display:none}</style>';
43+
$styleElement = "<style>$instantSearchHideCss</style>";
2244
?>
2345
// Hide the instant-search selector ASAP to remove flickering. Will be re-displayed later with JS.
24-
document.write('<?= /* @noEscape */ $css; ?>');
46+
document.write('<?= $escaper->escapeJs($styleElement) ?>');
2547
<?php
2648
endif;
2749
?>
28-
29-
window.algoliaConfig = <?= /* @noEscape */ json_encode($configuration); ?>;
50+
window.algoliaConfig = JSON.parse('<?= $escaper->escapeJs(json_encode($configuration)) ?>');
3051
</script>
3152
<?php endif; ?>
3253

@@ -39,4 +60,4 @@ if (class_exists('\Magento\Framework\View\Helper\SecureHtmlRenderer')): ?>
3960
}
4061
}
4162
</script>
42-
<?php endif;?>
63+
<?php endif; ?>

0 commit comments

Comments
 (0)