If the bbcodes require inline styles, then add the style-src 'unsafe-inline' rule to the Content-Security-Policy header

This commit is contained in:
Visman 2023-06-17 01:21:25 +07:00
parent 36c160c0f7
commit f85dd4743c
3 changed files with 58 additions and 6 deletions

View file

@ -144,4 +144,24 @@ class Parser extends Parserus
return $this->getHtml();
}
/**
* Флаг использования встроенных стилей
*/
protected bool $flagInlneStyle = false;
/**
* Устанавливает/возвращает флаг использования встроенных стилей в ббкодах
* (обработчик ббкода должен вызвать этот метод со значением true)
*/
public function inlineStyle(bool $flag = null): bool
{
$prev = $this->flagInlneStyle;
if (true === $flag) {
$this->flagInlneStyle = $flag;
}
return $prev;
}
}

View file

@ -67,13 +67,9 @@ EOD;
*/
public function rendering(Page $p): ?string
{
foreach ($p->httpHeaders as $catHeader) {
foreach ($catHeader as $header) {
\header($header[0], $header[1]);
}
}
if (null === $p->nameTpl) {
$this->sendHttpHeaders($p);
return null;
}
@ -93,6 +89,20 @@ EOD;
$this->endBlock(true);
}
$this->sendHttpHeaders($p);
return $this->block('content');
}
/**
* Отправляет HTTP заголовки
*/
protected function sendHttpHeaders(Page $p): void
{
foreach ($p->httpHeaders as $catHeader) {
foreach ($catHeader as $header) {
\header($header[0], $header[1]);
}
}
}
}

View file

@ -401,6 +401,14 @@ abstract class Page extends Model
protected function gethttpHeaders(): array
{
foreach ($this->c->HTTP_HEADERS[$this->hhsLevel] as $header => $value) {
if (
'Content-Security-Policy' === $header
&& $this->c->isInit('Parser')
&& $this->c->Parser->inlineStyle()
) {
$value = $this->addUnsafeInline($value);
}
$this->header($header, $value);
}
@ -409,6 +417,20 @@ abstract class Page extends Model
return $this->httpHeaders;
}
/**
* Добавляет в заголовок (Content-Security-Policy) значение unsafe-inline для style-src
*/
protected function addUnsafeInline(string $header): string
{
if (false === \strpos($header, 'style-src')) {
return $header . ';style-src \'self\' \'unsafe-inline\''; // ???? брать правила с default-src ?
} elseif (\preg_match('%style\-src[^;]+?unsafe\-inline%i', $header)) {
return $header;
} else {
return \str_replace('style-src', 'style-src \'unsafe-inline\'', $header);
}
}
/**
* Устанавливает HTTP статус страницы
*/