Pregunta

Actualmente estoy trabajando en una aplicación que requiere que los usuarios envíen publicaciones y comentarios que se muestran en el sitio.Como todos sabemos, no se puede confiar en la entrada del usuario, así que utilicé htmlspecialchars($string,ENT_QUOTES) para procesar las publicaciones y comentarios de los usuarios.

Ahora, quiero que se ignoren algunas etiquetas html.como <b><br /> y algunas etiquetas más.¿Cómo puedo hacerlo para que htmlspecialchars ignore algunas etiquetas mientras filtra las demás?

¿Fue útil?

Solución

solución a)
use strip_tags en lugar de htmlspecialchars y ponga en la lista blanca las etiquetas necesarias.
mejor solución b)
Use bbcodes y asigne alias a las etiquetas deseadas, por ejemplo: [b] negrita [/ b]

Otros consejos

Es muy, muy difícil permitir solo algunas etiquetas HTML sin permitir ninguna posibilidad de inyección de script o similar.

Realmente recomendaría evitar esto y usar algo que genere HTML, como este código UBB analizador (o similar). O incluso Markdown (con la opción HTML desactivada).

Eso no da margen para que los atacantes ataquen su sitio, lo cual es muy importante si está dirigido al público.

Si permite incluso un poco de HTML, es probable que un atacante determinado encuentre una forma de evitarlo.

¿Cansado de usar BBCode debido al panorama actual de filtros HTML deficientes o inseguros?
- > Purificador HTML

HTML Purifier es una biblioteca de filtros HTML compatible con los estándares escrita en PHP. HTML Purifier no solo eliminará todo el código malicioso (mejor conocido como XSS) con una lista blanca completamente auditada, segura pero permisiva, ...

Puede reemplazar la cadena entre comillas para volver a insertar las etiquetas permitidas. Para <b> etiquetas, por ejemplo:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

Solo permitiría que etiquetas muy distintas y completas sean lo más seguras posible. Es decir. No use expresiones regulares si no es necesario, puede provocar errores muy desagradables.

Recomiendo encarecidamente que use Zend_Filter para filtrar a través de la entrada del usuario. Específicamente, ver: http://framework.zend.com/ manual / es / zend.filter.html # zend.filter.introduction.using

Esto no es tan simple como podría ser porque ni htmlspecialchars() ni htmlentities() ofrece opciones para ignorar ciertas etiquetas (ambas funciones ni siquiera conocen el significado de la noción de etiquetas ).

Podrías usar algún otro medio para permitir a los usuarios formatear sus publicaciones, p. BBCode , Textil o Markdown . Hay analizadores PHP disponibles para todos ellos.

Si tiene que seguir con las etiquetas html, podría recurrir a un preprocesamiento que reformatee las etiquetas permitidas para que no se vean afectadas por <a> . Luego puede postprocesar el resultado para volver a cambiar el formato a etiquetas HTML normales. El siguiente ejemplo visualiza este proceso para una simple etiqueta <=>. Tenga en cuenta que el procesamiento de HTML con expresiones regulares es propenso a errores y no siempre es el camino a seguir: lo usaré solo por simplicidad en este ejemplo.

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Esto no se ha probado y seguramente requerirá mucho más trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top