Pregunta

Estoy muy confundido por algo y me preguntaba si alguien podría explicar.

En PHP i validar la entrada del usuario de modo htmlentitiies, mysql_real_escape_string se utiliza antes de insertar en la base de datos, no en todo como yo prefiero usar expresiones regulares cuando puedo, aunque me parecen difíciles de trabajar. Ahora, obviamente, voy a utilizar mysql_real_escape_string como los datos van en la base de datos pero no está seguro debo utilizar htmlentities () sólo cuando la obtención de datos de base de datos y mostrarlo en una página web ya que al hacerlo antes de mano está alterando los datos introducidos por una persona la cual no está manteniendo su forma original, que puede causar problemas si quiero usar esos datos para su uso posterior en otra cosa.

Así, por ejemplo, tengo un libro de visitas con el nombre de 3 campos, asunto y mensaje. Ahora, evidentemente, los campos pueden contener algo como código malicioso en las etiquetas js básicamente cualquier cosa, ahora lo que me confunde es Digamos que soy una persona con malas intenciones y yo decidimos utilizar etiquetas js y algo de código JS malicous y enviar el formulario, ahora, básicamente, tengo malicioso datos inútiles en mi base de datos. Ahora utilizando htmlentities cuando se da salida al código malicioso a la página web (libro de visitas), que no es un problema porque htmlentities ha convertido a que es seguro equivalente pero al mismo tiempo tengo código malicioso inútil en la base de datos que yo preferiría no tener.

Así que después de decir todo esto, mi pregunta es ¿Debo aceptar el hecho de que algunos datos en la base de datos tal vez maliciosos, datos inútiles y el tiempo que yo uso en la producción htmlentities todo va a estar bien o debería estar haciendo algo más aswell ?.

He leído tantos libros diciendo sobre el filtrado de datos sobre la recepción de él y escapar en darle salida por lo que la forma original se mantiene, sino que solamente siempre dan ejemplos como garantizar la igualdad no es más que un int usando funciones ya están integrados en php, etc, pero yo nunca han encontrado nada en lo que respecta asegurando algo así como un libro de visitas en el que desea que los usuarios escriban lo que quieran, sino también cómo se filtrar estos datos, aparte de mysql_real_escape_string () para asegurarse de que no se rompe la consulta DB?

Podría alguien finalmente cerca de esta confusión para mí y me dice lo que debo hacer y lo que es mejor práctica?

Gracias a cualquiera que pueda explicar.

Saludos!

¿Fue útil?

Solución

Esta es una pregunta mucho, pero creo que lo que realmente está pidiendo se reduce a:

"En caso de que escape de HTML antes de insertarlo en mi base de datos, o cuando voy a mostrarlo?"

La respuesta generalmente aceptada a esta pregunta es que debe escapar del HTML (a través de htmlspecialchars) cuando se va a mostrar al usuario, y no antes de ponerlo en la base de datos.

La razón es la siguiente: almacena los datos de una base de datos. Lo que está poniendo en él es lo que escribe el usuario. Cuando se llama a mysql_real_escape_string, no altera lo que se inserta en la base de datos; simplemente evita interpretar la entrada del usuario como las sentencias SQL. htmlspecialchars hace lo mismo para el HTML; cuando se imprime la entrada del usuario, se evitará tener que interpretarse como HTML. Si se va a htmlspecialchars llamada antes de la inserción, ya no está siendo fiel.

Siempre debe esforzarse por tener la máxima representación fidelidad que puede obtener. Dado que almacenar el código "malicioso" en su base de datos no hace daño (de hecho, que le ahorra un poco de espacio, ya escapado HTML es más larga que sin escapar!), Y es posible que en el futuro que desee que HTML ( lo que si se utiliza un analizador de XML en los comentarios de los usuarios, o algún día permitir a los usuarios de confianza tienen un subconjunto de HTML en sus comentarios, o algo así?), ¿por qué no dejar que sea?

También pide un poco acerca de otros tipos de validación de entrada (limitaciones enteros, etc.). Su esquema de base de datos debe cumplir estos, y también se puede comprobar en la capa de aplicación (preferiblemente en la entrada a través de JS y luego de nuevo del lado del servidor).

Por otro lado, la mejor manera de hacerlo escapar base de datos con PHP es probablemente usar DOP, en lugar de llamar directamente mysql_real_escape_string. DOP tiene una funcionalidad más avanzada, incluyendo la comprobación de tipos.

Otros consejos

mysql_real_escape_string() es todo lo necesario para las operaciones de bases de datos. Se va a asegurarse de que un usuario malicioso no puede incrustar algo en datos que va a "romper" sus consultas.

htmlentities() y htmlspecialchars() entran en juego cuando se trabaja con el envío de material para el cliente / navegador. Si desea limpiar HTML potencialmente hostil, sería mejor usar HTMLPurifier , que se tira de los datos de el lecho rocoso y la manguera hacia abajo con lejía y reconstruirlo correctamente.

No hay razón para preocuparse de tener el código JavaScript malicioso en la base de datos si está escapando el código HTML cuando salga. Sólo asegúrese de que siempre haces de escape todo lo que sale de la base de datos.

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