Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Signo de pesos contenido en una variable

Estas en el tema de Signo de pesos contenido en una variable en el foro de PHP en Foros del Web. Hola como estan? Hice una aplicacion que recoge datos de los usuarios y luego los pasa a un fichero. La aplicacion le pide datos mediante ...
  #1 (permalink)  
Antiguo 15/12/2014, 06:40
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Signo de pesos contenido en una variable

Hola como estan?

Hice una aplicacion que recoge datos de los usuarios y luego los pasa a un fichero.

La aplicacion le pide datos mediante un form y la pasa a una pagina que las procesa mediante sesiones

//codigo
$_SESSION["pass1"] = "$pass1";

Cuando el texto que el usuario escribe contiene un signo de $ la variable queda vacia, si pone cualquier otro caracter o conjunto de caracteres la aplicacion funciona perfectamente

Alguna idea de como hacer que tome el contenido como "texto puro"?
  #2 (permalink)  
Antiguo 15/12/2014, 08:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Signo de pesos contenido en una variable

http://php.net/manual/es/language.ty....syntax.single
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 15/12/2014, 10:23
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Signo de pesos contenido en una variable

Gracias por tu respuesta, estuve viendo el link pero el problema es que no se cual es la posicion donde va a estar el signo de $ dentro de la variable por lo que no puedo escaparlo y tampoco puedo poner '$variable' ya que necesito referenciar a la misma como una variable.

EL problema es que la variable $password puede contener mipass$2014 y al pasarla me corta el signo y queda solo "mipass"

No se si me explico
  #4 (permalink)  
Antiguo 15/12/2014, 10:43
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Signo de pesos contenido en una variable

La interpolacion solo se hace de forma explicita.
El problema sin duda esta en otra parte de tu codigo o en la forma que realizas la tarea.

Código PHP:
Ver original
  1. $a = 'texto con $signo pesos';
  2. $b = "$a";
  3. echo $b; // texto con $signo pesos

Publica todo el codigo involucrado si quieres obtener mas ayuda.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 16/12/2014, 08:11
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Signo de pesos contenido en una variable

Te comento como es el proceso que hago

1) Le pido al usuario en la pagina index.php los datos en un formulario y los paso por POST a pre_proceso.php

2) En pre_proceso.php hago lo siguientes

<?php
$usuario1 = $_POST['usuario1'];
$pass1 = $_POST['pass1'];
session_start();
$_SESSION["usuario1"] = "$usuario1";
$_SESSION["pass1"] = "$pass1";

Inicio sesion y guardo los valores en la variable ya que esta pagina es unicamente un puente a la verdera pagina que hara el trabajo llamada procesar.php

3) En procesar.php hago lo siguientes

session_start ();
$usuario1 = $_SESSION["usuario1"];
$pass1 = $_SESSION["pass1"];

//Generamos el fichero usuario.txt donde almacenaremos provisoriamente los datos
$texto = shell_exec("echo $usuario1 $pass1 $usuario1.txt");

Cuando voy a leer usuario1.txt siempre se corta el valor en el signo de $ este al principio o al medio, es decir, si en el formulario puse peter$parker solo vere “peter” en el fichero de texto
  #6 (permalink)  
Antiguo 16/12/2014, 10:51
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Signo de pesos contenido en una variable

Eso es para algún experimento tuyo y no para algo que valla a ser puesto en producción verdad?

¿Que pasaria si en el formulario alguien pusiera rm -rf directorio? te borraría un directorio del disco!

O peor aun, podría crearse un usuario nuevo o cualquier cosa!

Eso es totalmente inseguro y peligroso!

NUNCA o salvo condiciones muy particulares, debes enviar datos provenientes del usuario a la consola, y solo debe hacerse si no hay ninguna otra vía posible para resolverlo.

Llegado el caso, los argumentos deben ser debidamente escapados con escapeshellarg y escapeshellcmd.

No entiendo el porque de una pagina puente, no tiene sentido, tampoco es necesario usar la shell para guardar datos en un archivo, tampoco es necesario entrecomillar las variables para que sean interpoladas si no les vas a anexar ningún contenido.

Ademas tienes varios problemas adicionales.

Código PHP:
Ver original
  1. <?php
  2.    /*/
  3.     * Esta tecnica de extraer las variables, carece de sentido.
  4.     * Se usaba cuando $_POST se llamada $HTTP_POST_VARS, con lo cual, para ahorrar espacio se ponia:
  5.     * $post_variable = $HTTP_POST_VARS["variable"];
  6.     * Ahora ya no hace falta.
  7.     * Ademas de que debes validar cada entrada del usuario, minimamente, hay que verificar su existencia.
  8.    /*/
  9.    $usuario1 = $_POST['usuario1'];
  10.    $pass1 = $_POST['pass1'];
  11.    
  12.    /*/
  13.     * session_start debe ser la primer linea del archivo si o si, eventualmente, puede no serlo,
  14.     * pero en tal caso, debes estar 100% seguro que antes de que se llame, no se halla producido
  15.     * ninguna salida al navegador.
  16.     * Si $_POST['usuario1'] o $_POST['pass1'] no estubiera definida, php arrojaria un notice, con lo cual
  17.     * no se podria iniciar la session. Una cadena de errores por un simple detalle.
  18.    /*/
  19.    
  20.    /*/
  21.     * No hay razon para interpolar, esta tecnica solo se usa para anexar contenido de forma comoda
  22.     * tu no estas anexando nada, no tiene sentido.
  23.    /*/
  24.    $_SESSION["usuario1"] = "$usuario1";
  25.    $_SESSION["pass1"] = "$pass1";
  26.  
  27.     /*/
  28.      * "Inicio sesion y guardo los valores en la variable ya que esta pagina es unicamente un puente a la verdera pagina que hara el trabajo llamada procesar.php"
  29.      * ¿Que sentido tiene un script puente que realiza una copia de variables?
  30.     /*/
  31.  
  32.     session_start ();
  33.     /*/
  34.      * Lo mismo que antes, no validas nada, ni siquiera la existencia.
  35.      * Tampoco tiene sentido copiar la variable.
  36.     /*/
  37.     $usuario1 = $_SESSION["usuario1"];
  38.     $pass1 = $_SESSION["pass1"];
  39.  
  40.     /*/
  41.      * "Generamos el fichero usuario.txt donde almacenaremos provisoriamente los datos"
  42.      * ¿Esta es la mejor forma que se te ocurrio para guardar un texto en un archivo?
  43.      * Ademas estas metiendo variables que vienen de un formulario directamente en la consola! eso es muy peligroso!
  44.      * Tambien es peligroso crear archivos con el nombre de una variable introducida por el usuario.
  45.      * ¿Porque provisoriamente? No me digas que este es otro script puente que guarda los datos aca para que otro venga los lea y los borre.
  46.      * Si no pones seguridad de lectura sobre el directorio, cualquiera podria entrar y obtener la clave solo sabiendo el nombre de usuario.
  47.     /*/
  48.     $texto = shell_exec("echo $usuario1 $pass1 $usuario1.txt");

La forma correcta seria tener UN SOLO archivo para procesar el formulario, con algo asi:
Código PHP:
Ver original
  1. <?php
  2.     /*/
  3.      * Aca agregar validaciones que no arrojen ninguna salida al navegador ni generen errores.
  4.     /*/
  5.     if(empty($_POST["usuario1"]) || empty($_POST["pass1"]))
  6.     {
  7.         die("datos invalidos");
  8.     }
  9.  
  10.     session_start();
  11.     $_SESSION["usuario1"] = $_POST["usuario1"];
  12.     $_SESSION["pass1"] = $_POST["pass1"];
  13.    
  14.     file_put_contents(md5("algo_secreto".$_SESSION["usuario1"]).".txt", "$_SESSION[usuario1] $_SESSION[pass1]");
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 16/12/2014, 11:04
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Signo de pesos contenido en una variable

Gracias por tu respuesta, fue muy esclarecedora

Te comento por que hago las cosas que hago, el comando en cuestion no es el que te escribi, el comando es un script que hace otra cosa.

El problema es que esa otra cosa demora cerca de 2 horas por usuario, si pongo el proceso en un solo formulario corro el peligo de que el usuario crea que la pagina se colgo y no hizo nada y vuelva a tirar el boton submit.

La pagina del form recoge los datos y los pasa a la pagina puente deonde le digo al usuario que todo va a estar bien y que el proceso va a demorar horas y que deje la ventana abierta. mientras se preocesa eso el usuario no va a volver a apretar el boton.

Si en el formulario alguien poner rm- f directorio u otro comando no pasa nada ya que el script que recibe ese parametro da un error. el scrip espera recibir un usuario y contraseña, si en el campo contraseña pongo un comando no hace nada.

Gracias nuevamente por tu respuesta, la voy a estar probando ahora en la aplicacion y tec uento como me va
  #8 (permalink)  
Antiguo 16/12/2014, 11:31
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Signo de pesos contenido en una variable

Cita:
Si en el formulario alguien poner rm- f directorio u otro comando no pasa nada ya que el script que recibe ese parametro da un error. el scrip espera recibir un usuario y contraseña, si en el campo contraseña pongo un comando no hace nada.
El problema no es lo que el script espera sino lo que la shell interpreta.
Con el texto correcto, se podría hacer que tu script nunca se ejecutara y en su lugar disparar otro comando, solo es cuestión de armar la sintaxis correctamente para que eso ocurra.

Este tipo de ataques se llama shell-injection y es de los mas peligrosos. Con una linea de código pueden literalmente vaciarte el servidor y hacerte perder todo.

Tu has lo que quieras, estas avisado.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 16/12/2014, 11:37
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Signo de pesos contenido en una variable

Me exprese incorrectamente,

Lo que me dices de scapeshellarg y cmd son dos consejos super valiosos que voy a estar poniendo en practica ahora mismo por que como bien dices, son agujeros de seguridad importantes.

Hasta que no me lo dijiste no me habia dado cuenta de que se podia hacer.

Estoy estduiando como escapar "|" y otros en eso y cuando termine te cuento como me fue

Muchas gracias por toda tu ayuda

EDIT: Con scapeshellcmd solucione ambos problemas, el problema de que no me pongan comandos en los argumentos como |rm fichero.txt y tam bien el signo de $

Gracias nuevamente

Última edición por Hyemin; 16/12/2014 a las 11:45

Etiquetas: contenido, pesos, signo, usuarios, variable
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 13:22.