Требуется ли htmlspecialchars() для ВСЕГО вывода?
Я пишу несколько скриптов для Expression Engine, и мне сказали, что каждый отдельный фрагмент данных, который мы выводим на страницу, требует "очистки" для предотвращения XSS.
Например, здесь я выбираю все Категории из базы данных, сортирую их в массив и возвращаю в Expression Engine.
PHP функция
public function categories()
{
$query = $this->crm_db->select('name, url_name')
->order_by("name", "asc")
->get_where('activities_categories', array('active'=>1));
foreach($query->result() as $row)
{
$activityCategories[0]['cats'][] = array(
'categoryName' => $row->name,
'categoryURL' => $row->url_name,
);
}
return $this->EE->TMPL->parse_variables($this->EE->TMPL->tagdata, $activityCategories);
}
Код шаблона
{exp:activities:categories}
{cats}
<a href="/{categoryURL}">{categoryName}</a>
{/cats}
{/exp:activities:categories}
Мне говорят, что мне нужно использовать функцию htmlspecialchars() для каждого фрагмента данных, который выводится.
Это необходимо?
Это правильно?
Пример:
foreach($query->result() as $row)
{
$activityCategories[0]['cats'][] = array(
'categoryName' => htmlspecialchars($row->name),
'categoryURL' => htmlspecialchars($row->url_name),
);
}
Большое спасибо!:)
3 ответа
htmlspecialchars()
требуется для ВСЕГО вывода HTML, если не указано иное.
Другие средства вывода (такие как JS
, JSON
и т.д.) требуют собственного побега.
Будь то htmlspecialchars
Достаточно или нет, зависит от контекста, в который вводятся данные. Потому что он экранирует только определенные символы, используя символьные ссылки, которые являются только смягчением в определенных контекстах:
Если это текст HTML (вне тегов HTML), достаточно:
<p>❌</p>
Если оно находится внутри значения атрибута HTML в кавычках, этого достаточно (см. Также параметр flags для атрибутов в одинарных кавычках):
<span title="❌"> … </span>
Однако существуют определенные атрибуты, которые все еще могут использоваться для XSS, например, атрибуты для URI.
Любой другой контекст может потребовать экранирования других символов. Например, значение атрибута без кавычек потребует экранирования любого символа пробела, так как в противном случае значение атрибута закончится.
Также обратите внимание, что для контекста могут потребоваться разные типы кодировок. Например, если вы хотите напечатать значение JavaScript, встроенное в <script>
Вы должны соблюдать правила синтаксиса JavaScript и HTML.
Ну, если вы не хотите проблем с XSS, тогда используйте htmlspecialchars()
хорошая идея Если вы этого не сделаете, кто-то может хранить вредоносный <iframe>
, или же <script>
в вашем коде.
Теперь вам не обязательно защищать вывод. Если вы обрабатываете поступающие данные, вы можете вместо этого хранить очищенные данные. Делая это таким образом, вы можете целенаправленно хранить несанитарные данные для, возможно, стилизации, которые были бы готовы к выводу.
Что касается вашего примера, это правильно. Это один из способов, которым вы можете сделать это.
РЕДАКТИРОВАТЬ: вам нужно только подать заявку htmlspecialchars()
в строки.