Para ser sumamente honesto, esta función es solo una recopilación arbitraria de procedimientos más o menos inútiles o dañinos y, en ocasiones, incluso contradictorios, la mayoría de los cuales no tiene nada que ver con la seguridad. Ahora a la parte más importante.
Inyección SQL
Para evitar que mi sitio web se inyecte en SQL, siempre uso $db->real_esacpe_string()
Que es lo que estas haciendo mal. Sin embargo, no estás solo, lo enumero como el la más infame ilusión de PHP . Citando de esa página:
esta función no tiene absolutamente nada que ver con la seguridad o las inyecciones, simplemente evita los caracteres especiales en los literales de cadena SQL, lo que los hace inmunes a la inyección SQL como efecto secundario, pero es completamente inútil para cualquier otra parte de la consulta, desde un nombre de tabla hasta Un literal numérico. Para protegerse de la inyección SQL, se deben seguir dos reglas simples:
- Cualquier literal de datos variables (es decir, una cadena o un número) debe sustituirse por un parámetro, mientras que el valor real debe enviarse a la consulta por separado, mediante el proceso de enlace / ejecución.
- Todas las demás partes de consulta que se agreguen a través de una variable, deben filtrarse explícitamente a través de una lista codificada de valores permitidos.
Dado que mysqli en bruto es bastante difícil con las declaraciones preparadas, sugeriría estrictamente utilizar DOP en su lugar.
Entonces, la idea principal de que nada relacionado con la seguridad de SQL debería estar en tal función.
XSS
Veamos qué estás haciendo con los caracteres maliciosos <
y >
:
- primero, todas las etiquetas se eliminan con
strip_tags($text);
- entonces estos símbolos (ya extintos del texto) se reemplazan con una cadena vacía
- finalmente esos caracteres no existentes se convierten en entidades HTML
Si alguna vez me pide que defina "exceso", le mostraré esta función. htmlspecialchars()
solo debería ser suficiente para evitar XSS en el cuerpo de la página.
Lo que es más importante, parece que está utilizando esta función en la entrada de datos que es incorrecta. Un texto debe ser formateado justo antes de la salida, de acuerdo con las reglas de formato para el medio determinado. Si está generando en el cuerpo de la página HTML, sería htmlspecialchars
. Si el texto va a JavaScript, debería ser otro formato, etc.
Cosas inútiles
-
trim()
no tiene nada que ver con la seguridad, podría usar esta función para su comodidad.
- en una nota al margen, nunca uses este operador
@
. Es perjudicial para su experiencia de programación.
-
stripslashes()
también, no tiene nada que ver con la seguridad. Además, esta función es simplemente inútil, nunca haciendo nada sensato.
- Sin mencionar que
get_magic_quotes_gpc()
es dos veces inútil, devolviendo un valor que se eliminó de PHP hace 10 años.
Conclusión
- deshacerse de esta función
- para evitar la inyección SQL siga las 2 reglas de arriba
- para evitar que XSS use
htmlspecialchars
al generar sus datos o cualquier otro formato apropiado.