Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Inyectar contenido de BD dentro de HTML...

Estas en el tema de Inyectar contenido de BD dentro de HTML... en el foro de PHP en Foros del Web. Hola! La idea es la sig. Tengo una base de datos con 4 campos: id usuario contrasena formulario_upload (contiene unos 1,200 caracteres de puro HTML) ...
  #1 (permalink)  
Antiguo 02/11/2014, 22:35
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Inyectar contenido de BD dentro de HTML...

Hola!

La idea es la sig. Tengo una base de datos con 4 campos:
  1. id
  2. usuario
  3. contrasena
  4. formulario_upload (contiene unos 1,200 caracteres de puro HTML)
También tengo un formulario de login. Mediante AJAX checo que si usuario y contraseña sean correctos. Si son correctos entonces intento inyectar el contenido de formulario_upload dentro de un simple div en mi página.

Pero no me sale. He hecho pruebas y veo que si reduzco el HTML a unos 30 ó 40 caracteres, la cosa funciona bien.

Código PHP:
$usuario    $_POST["usuario"];
$contrasena $_POST["contrasena"];
$query      "SELECT * FROM usuarios";
$respuesta  = new stdClass();
$mysqli     = new mysqli("localhost""root""""mi_base_de_datos");


if( (!empty(
$_POST["usuario"])) && (!empty($_POST["contrasena"])) )
{
    if ( 
$resultado $mysqli->query($query) ) {

        while (
$fila $resultado->fetch_array(MYSQLI_ASSOC))
        {
            
$user  $fila["usuario"];
            
$pass  $fila["contrasena"];
            
$forma $fila["formulario_upload"];

              if ( (
$user == $usuario) && ($pass == $contrasena) )  {
                  
$respuesta->mensaje $forma;  // Si en vez de $forma ponemos $user o $pass, se inyecta bien el valor de éstos.
                  
break;
              }
              else {
                  
$respuesta->mensaje 'El usuario y contraseña introducidos son incorrectos.';
              }
        }
    }
}

echo 
json_encode($respuesta);
mysqli_close($mysqli); 

Nota: El campo formulario_upload es VARCHAR con cotejamiento utf8_general_ci, y con longitud de hasta 2,000 caracteres (le puse así por si acaso me quedaba corto).

¿Alguna idea de por qué no se inyecta el valor de dicho campo?

Saludos!


Última edición por berkeleyPunk; 02/11/2014 a las 22:44
  #2 (permalink)  
Antiguo 03/11/2014, 00:53
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Inyectar contenido de BD dentro de HTML...

Dos preguntas:
  1. ¿Qué resultado obtienes en la petición asíncrona, es decir, de json_encode($respuesta)?
  2. ¿Por qué guardas una estructura HTML en la BD? ¿No sería más sencillo el que tengas un archivo con N tipos de formularios, en la BD guardes el tipo de formulario y, según sea este, muestres el que corresponda?

La segunda pregunta es más curiosidad que otra cosa pues no he visto hacer esto antes a alguien. Quizá sea más eficiente (aunque no lo creo), pero para eso pregunto, para salir de la duda.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 03/11/2014, 05:09
 
Fecha de Ingreso: abril-2012
Mensajes: 124
Antigüedad: 12 años
Puntos: 3
Respuesta: Inyectar contenido de BD dentro de HTML...

Tampoco entiendo qué hace el json_encode. Si en la tabla guardas html puro deberías poder mostrarlo directamente.
  #4 (permalink)  
Antiguo 03/11/2014, 14:53
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: Inyectar contenido de BD dentro de HTML...

Cita:
Iniciado por Alexis88 Ver Mensaje
...¿Por qué guardas una estructura HTML en la BD?...
Hola, maestro. Contesto tu primera segunda pregunta, la otra, al rato cuando llegue a casa. Meto el HTML en la BD por cuestiones de seguridad. Mira, muy probablemente lo que hago no esté bien, y haya por ahí una solución infinitamente más óptima, pero eso fue lo que se me ocurrió y, bueno, pues ahí está .

Estoy creando una especie de administrador que consiste en que mediante un formulario una persona podrá subir un PDF a una página web. Antes de poder subir el PDF debe loguearse, y si lo hace correctamente, se le muestra el formulario para cargar el archivo. Este último formulario evidentemente no puede estar oculto sólo con CSS (alguien podría abrir el inspeccionador de elementos, ponerle un display: block) y ya, subir un PDF porno, digamos (aunque no está mal que sea porno ). Entonces, el formulario no debe estar ahí, punto. Por eso se me ocurrió ponerlo en un campo de la base de datos e inyectarlo en el HTML sólo se en caso de un login correcto.

Dime por favor que existe otra forma, más fácil y eficiente!

Saludos!
  #5 (permalink)  
Antiguo 04/11/2014, 16:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Inyectar contenido de BD dentro de HTML...

Si tuvieras un algoritmo seguro del lado del servidor, lo que haga el cliente, no debería de preocuparte.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 05/11/2014, 06:10
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: Inyectar contenido de BD dentro de HTML...

No se te inserta el valor porque VARCHAR almacena hasta 255 caracteres. Para almacenar cadena de texto más grandes tenés los types TEXT y BLOB.

Saludos
  #7 (permalink)  
Antiguo 05/11/2014, 06:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inyectar contenido de BD dentro de HTML...

Cita:
Iniciado por GeekGirl Ver Mensaje
No se te inserta el valor porque VARCHAR almacena hasta 255 caracteres. Para almacenar cadena de texto más grandes tenés los types TEXT y BLOB.

Saludos
Eso no es correcto.
Los tipos VARCHAR almacenaron hasta 255 caracteres sólo hasta la versión 5.0.3. Desde entonces (y hace bastantes años), el limite es superior.
Manual de referencia oficial:
Cita:
Los valores en columnas VARCHAR son cadenas de longitud variable. La longitud puede especificarse como un valor de 0 a 65.535. La longitud máxima efectiva de un VARCHAR está sujeto al tamaño máximo de fila (65535 bytes, que es compartida entre todas las columnas) y el conjunto de caracteres utilizado.
Esa especificación de 255 caracteres corresponde a los CHAR, pero los manuales obsoletos e inservibles que hay en la red persisten en el error de atribuirlo al VARCHAR.

Es altamente probable que el problema se deba al contenido del HTML si conteine alguna forma de caracteres reservados, tales como apóstrofes o contrabarras, lo que puede romper con la construccion del INSERT.
Lo que seguro NO es, es un tema de limite de datos, a menos que el html haya superado los 65.536 caracteres.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 05/11/2014, 06:29
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: Inyectar contenido de BD dentro de HTML...

Lamentablemente me lo han enseñado mal en la escuela. Aún así, cómo sabemos que está usando una versión posterior a la 5.0.3?
  #9 (permalink)  
Antiguo 05/11/2014, 06:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inyectar contenido de BD dentro de HTML...

Por lo pronto, es muy raro encontrar un hosting que tenga una versión anterior a la 5.1.x, porque eso habría sido quedarse entre siete a diez años en el pasado. Y ningún servicio de ese tipo se jugaría con algo tan obsoleto.

Por otro, es simplemente hacer un
Código MySQL:
Ver original 
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 12/11/2014, 07:58
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Inyectar contenido de BD dentro de HTML...

Definitivamente no tengo un PHP tan viejo. Es 5.4, me parece.

Perdón por responder tan tarde, el trabajo...

Resolví mi bronca. En efecto, dejé a un lado la idea de meter en la BD cadenas de HTML. ¿Para qué? Lo hacía por motivos de seguridad, pero veo que la cosa se arregla haciendo includes PHP y sesiones. Por ejemplo, se loguea el usuario, si las credenciales son correctas, entonces creo una variable de sesión que indique que está logueado y hago un include con el HTML que tiene que ver en este caso. Si no existe esa variable de sesión, entonces no está logueado y no meto el include. Eso es todo .

Así la BD queda super limpia. No hay HTML, sólo nombres de usuario, contraseñas, etc.

Nota. Me surgió otro problema que tiene que ver con otro asunto. Si pueden y quieren, échenme una mano con esto: ¿por qué parece que los archivos PDF de mi servidor, no son públicos?


Saludos!

Etiquetas: mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:24.