Требуется ли htmlspecialchars () для вывода ALL?

Я пишу некоторые сценарии для 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), ); } 

Большое спасибо! 🙂

Solutions Collecting From Web of "Требуется ли htmlspecialchars () для вывода ALL?"

htmlspecialchars() требуется для вывода всего HTML, если не указано иное.

Другие выходные носители (такие как JS , JSON и т. Д.) Требуют их собственного экранирования.

Достаточно ли htmlspecialchars или нет, зависит от контекста, в который помещаются данные. Поскольку он только ускользает от определенных символов, используя ссылки на символы, которые являются лишь смягчением в определенных контекстах:

  • Если это HTML-текст (вне HTML-тегов), достаточно:

     <p>❌</p> 
  • Если он находится в указанном значении атрибута HTML, достаточно (см. Также параметр flags для атрибутов с одним кавычком):

     <span title="❌"> … </span> 

    Однако есть некоторые атрибуты, которые все еще могут использоваться для XSS, например атрибуты для URI.

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

Также обратите внимание, что для контекста могут потребоваться различные типы кодировок. Например, если вы хотите напечатать значение JavaScript, встроенное в <script> , вы должны подчиняться как правилам синтаксиса JavaScript, так и HTML.

Ну, если вы не хотите проблем с XSS, то использование htmlspecialchars() – хорошая идея. Если вы этого не сделали, кто-то может хранить в вашем коде вредоносное <iframe> или <script> .

Теперь вам не обязательно защищать выход. Если вы дезинфицируете поступающие данные, вы можете сохранить дезинфицированные данные. Выполнение этого способа позволяет вам целенаправленно хранить не подвергнутые санитарной обработке данные для целей стилизации, которые были бы готовы к выпуску.

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

EDIT : вам нужно всего лишь применить htmlspecialchars() к строкам.