Configurable via 'ALLOW_CONTENT_SCRIPTS' env variable.
Fixes #575
public function renderPage(Page $page, $ignorePermissions = false)
{
$content = $page->html;
+ if (!config('app.allow_content_scripts')) {
+ $content = $this->escapeScripts($content);
+ }
+
$matches = [];
preg_match_all("/{{@\s?([0-9].*?)}}/", $content, $matches);
if (count($matches[0]) === 0) {
return $content;
}
+ /**
+ * Escape script tags within HTML content.
+ * @param string $html
+ * @return mixed
+ */
+ protected function escapeScripts(string $html)
+ {
+ $scriptSearchRegex = '/<script.*?>.*?<\/script>/ms';
+ $matches = [];
+ preg_match_all($scriptSearchRegex, $html, $matches);
+ if (count($matches) === 0) return $html;
+
+ foreach ($matches[0] as $match) {
+ $html = str_replace($match, htmlentities($match), $html);
+ }
+ return $html;
+ }
+
/**
* Get the plain text version of a page's content.
* @param Page $page
'books' => env('APP_VIEWS_BOOKS', 'list')
],
+ 'allow_content_scripts' => env('ALLOW_CONTENT_SCRIPTS', false),
+
/*
|--------------------------------------------------------------------------
| Application Debug Mode
$pageView->assertSee('def456');
}
+ public function test_page_content_scripts_escaped_by_default()
+ {
+ $this->asEditor();
+ $page = Page::first();
+ $script = '<script>console.log("hello-test")</script>';
+ $page->html = "escape {$script}";
+ $page->save();
+
+ $pageView = $this->get($page->getUrl());
+ $pageView->assertDontSee($script);
+ $pageView->assertSee(htmlentities($script));
+ }
+
+ public function test_page_content_scripts_show_when_configured()
+ {
+ $this->asEditor();
+ $page = Page::first();
+ config()->push('app.allow_content_scripts', 'true');
+ $script = '<script>console.log("hello-test")</script>';
+ $page->html = "no escape {$script}";
+ $page->save();
+
+ $pageView = $this->get($page->getUrl());
+ $pageView->assertSee($script);
+ $pageView->assertDontSee(htmlentities($script));
+ }
+
}