Guardamos datos en nuestra base de datos después de pasarlos a través del método htmlentities para evitar ataques de inyección.
Y mientras lo usamos, hacemos html_entity_decode para recuperar el valor original. En algunos casos, en nuestro código, las htmlentities se realizan 2 o 3 veces en la misma porción de datos debido a nuestras técnicas de guardado (difícil de explicar). Básicamente, queremos evitar codificar las mismas cadenas varias veces.
¿Existe una buena manera confiable de detectar si una cadena ya se pasó a través del método htmlentities ?
Supongo que una forma es buscar cosas como " en la cadena codificada, pero ¿algo más confiable? ¿Algún método integrado que me diga si una cadena está codificada o no?
Estamos usando Laravel, ¿tal vez un método auxiliar allí que podría ayudarnos?
Este es fundamentalmente el enfoque incorrecto de la OMI. Almacene los datos sin procesar, tal como vienen. Mientras esté en la base de datos no puede hacerte ningún daño.
Páselo a través htmlentities solo cuando esté a punto de ponerlo en un documento HTML, porque ese es el único contexto en el que podría ser peligroso.
Eso ahorrará toda la codificación y decodificación: simplemente codifíquelo a pedido según sea necesario.
Como lo mencionó ADyson, está manejando los datos incorrectamente en todo su sistema.
El motor de plantillas de Laravel "Blade" enviará automáticamente sus variables a través de htmlspecialchars() para evitar ataques XSS.
De la documentación :
Las declaraciones Blade
{{ }}se envían automáticamente a través de la funciónhtmlspecialcharsde PHP para evitar ataques XSS.
Esto protegerá su sitio de posibles ataques XSS, sin necesidad de codificar/decodificar sus datos mientras ejecuta consultas INSERT / SELECT en su base de datos.
Siempre que esté utilizando DB Builder / Eloquent incorporado de Laravel, sus consultas SQL también están protegidas automáticamente :
El generador de consultas de Laravel utiliza el enlace de parámetros PDO para proteger su aplicación contra ataques de inyección SQL. No es necesario limpiar las cadenas que se pasan como enlaces.