Рейтинг:1

Почему знак одинарной кавычки экранирован внутри атрибута элемента рендеринга?

флаг in

Когда текст атрибута содержит одинарную кавычку, например «Это хороший день», эта одиночная кавычка при отображении заменяется на «Это хороший день». Почему так происходит и можно ли это предотвратить? Твиг убегает?

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Template%21Attribute.php/class/Attribute/8.2.x

он говорит:

«Ключи и значения атрибутов автоматически экранируются для вывода с помощью Html::escape()».

а также:

«Значения атрибутов считаются обычным текстом и обрабатываются соответствующим образом. Если обнаружена безопасная строка HTML, она преобразуется в обычный текст с помощью PlainTextOutput::renderFromHtml() перед экранированием».

Ни один из них не должен делать это преобразование.

флаг ru
*Почему это происходит и можно ли это предотвратить? * Потому что требуется всего 2 секунды, чтобы увидеть серьезную проблему безопасности: `
флаг ru
По сути, в 99 из 100 случаев ответ на вопрос *Почему он экранирован?* — *Потому что кто-то обнаружил проблему безопасности* ;-)
флаг cn
Я хочу футболку с этим на @Hudri, отличная фраза!
Рейтинг:0
флаг us

Атрибуты, созданные с помощью Атрибут класс сбежал.

Атрибут::__toString() код следующий.

$возврат = '';

/** @var \Drupal\Core\Template\AttributeValueBase $value */
foreach ($this->storage as $name => $value) {
  $рендеринг = $значение->рендеринг();
  если ($ визуализировано) {
    $возврат .= '' . $ визуализировано;
  }
}
возврат $возврат;

В классе, который расширяет AttributeValueBase, Например АтрибутСтрока, оказывать() содержит следующий код.

значение = (строка) $это;
if (isset($this->value) && static::RENDER_EMPTY_ATTRIBUTE || !empty($value)) {
  вернуть Html::escape($this->name) . '="' . $значение . '"';
}

АтрибутСтрока::__toString() содержит следующий код.

вернуть Html::escape($this->value);

Html:: побег() вызывается для имени атрибута и его значения. Вот почему атрибут, созданный с использованием кода, подобного следующему, одинарные кавычки внутри имени и значения атрибута экранируются.

$ атрибуты = новый атрибут (массив ());
$attributes['id'] = 'носки';
$attributes['style'] = 'цвет фона: белый';
эхо '<кот'. $атрибуты. '>';

Массив атрибутов::__toString() использует следующий код.

// Отфильтровать все пустые значения перед печатью.
$this->value = array_unique(array_filter($this->value));
return Html::escape(implode(' ', $this->value));

Это означает, что для атрибута, построенного с использованием кода, подобного приведенному ниже, значение атрибута экранируется.

$attributes = новый атрибут();
$attributes['класс'] = массив();
$attributes['класс'][] = 'кот';

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.