¿Se requiere htmlspecialchars () en TODA la salida?

Estoy escribiendo algunos scripts para Expression Engine y me han dicho que cada pieza de datos que enviamos a la página requiere “desinfección” para evitar el XSS.

Por ejemplo, aquí, estoy buscando todas las categorías de la base de datos, ordenándolas en una matriz y volviendo a Expression Engine.

Función de 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); } 

Código de plantilla

  {exp:activities:categories} {cats} {categoryName} {/cats} {/exp:activities:categories} 

Me han dicho que necesito usar la función htmlspecialchars () en cada pieza de datos que se está generando.

¿Es esto necesario?

¿Es esto correcto?

Ejemplo:

 foreach($query->result() as $row) { $activityCategories[0]['cats'][] = array( 'categoryName' => htmlspecialchars($row->name), 'categoryURL' => htmlspecialchars($row->url_name), ); } 

¡Muchas gracias! 🙂

htmlspecialchars() requiere htmlspecialchars() en TODA la salida HTML a menos que se indique lo contrario.

Otros medios de salida (como JS , JSON , etc.) requieren su propio escape.

Que baste o no, depende del contexto en el que se colocan los datos. Porque solo se escapa de ciertos caracteres que usan referencias de caracteres que son solo una mitigación en ciertos contextos:

  • Si se trata de texto HTML (fuera de las tags HTML), basta:

     

  • Si está dentro de un valor de atributo HTML citado, es suficiente (consulte también el parámetro de indicadores para atributos de una sola cita):

      

    Sin embargo, hay ciertos atributos que aún se pueden usar para XSS, por ejemplo, atributos para URI.

Cualquier otro contexto puede requerir el escape de otros personajes. Por ejemplo, un valor de atributo sin comillas requeriría que cualquier carácter de espacio en blanco también se escape, ya que de lo contrario terminaría el valor del atributo.

También tenga en cuenta que un contexto puede requerir diferentes tipos de codificaciones. Por ejemplo, si desea imprimir un valor de JavaScript incrustado en , debe obedecer las reglas de syntax de JavaScript y HTML.

Bueno, si no quieres problemas con XSS, entonces usar htmlspecialchars() es una buena idea. Si no lo hizo, alguien podría almacenar un malicioso, o en su código.

Ahora, no necesariamente necesitas proteger la salida. Si desinfecta los datos que ingresan, puede almacenar los datos desinfectados. Hacerlo de esta manera le permite almacenar a propósito los datos no desinfectados para fines de diseño que estarían listos para su salida.

En lo que respecta a su ejemplo, es correcto. Esa es una forma en que puedes hacerlo.

EDITAR : solo necesita aplicar htmlspecialchars() a cadenas.