El tema es el siguiente:
Cuando haces una pagina web y necesitas desplegar un dato como por ejemplo el nombre de una persona necesitas utilizar la codificación adecuada (en este caso esa codificación se llama entidad html), por ejemplo, si estamos programando en html vamos a tener un código como este:
Ahora, por norma de HTML dice que cuando colocas carácteres especiales estos deben ser codificados siempre en entidad html, por ejemplo:
<div><p>Pedro's</p></div>
Esto nos mostrará:
Ahora, esto no es que yo lo diga o que se le ocurrió a alguien, esto es norma y es parte del estandard del código HTML y esto es para prevenir justamente problemas cuando necesitas escribir código html sobre un html, por ejemplo:
Esto escribe:
Pero no lo ejecuta. Ahora cuando desde php dejas que las personas pongan lo que se les da la gana puedes provocar que se rompa la codificación completa del documento html y puede que en algunos navegadores no te aparezcan las letras de forma correcta o puedes provocar un agujero de seguridad de tipo XSS.
En este punto cuando dejas que la gente escriba lo que sea vas a tener problemas con los caracteres unicode, etiquetas, comillas, ampersand y cualquier carácter interpretable por el navegador.
Ahora, porque no es buena idea hacer tu propio filtro como lo acabas de hacer?, porque no eres un experto en seguridad informática ni sabes de memoria todos los posibles vectores de ataques (los cuales son muchisimos y no solo escribir etiquetas < y >).
Por ejemplo, digamos que mañana necesitas escribir un valor dentro de un parámetro de una etiqueta html:
<a href="test.php?texto=<?php echo $_GET['texto']; ?>">link</a>
Dentro del parámetro por url "texto" puedo inyectar un XSS:
test.php?texto=" onclick="alert(document.cookie)
Entonces tu HTML quedará así:
<a href="test.php?texto=" onclick="alert(document.cookie)">link</a>
Y te fijas que acá no usamos < ni >?, ese es otro vector como muchos otros, ahora tendrias que hacer otro filtro distinto para prevenir las comillas, despues tendras problemas con las comillas simples, despues con los backspaces, despues con los caracteres unicode, despues con los saltos de linea, despues con los ampersand, etc etc.
Entonces para que no te vueles la cabeza haciendo una chorronada de filtros o un filtro muy grande usas la función HTMLSPECIALCHARS el cual ya está diseñada para filtrar todos los posibles carácteres bajo el contexto necesario.
Te recomiendo que nunca dejes la seguridad de una aplicación en tus manos, siempre dejalo en manos del mismo creador del lenguaje de programación o framework que estás utilizando ya que hay gente mas especializada que ya se hizo todas estas preguntas antes y tienen las herramientas suficientes como para crear un ambiente seguro.
Saludos.