Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Leguim en 29 Julio 2020, 23:30 pm



Título: [Pregunta]: ¿Como podía escapar correctamente esta cadena?
Publicado por: Leguim en 29 Julio 2020, 23:30 pm
Hola,

tengo la siguiente cadena..
Código
  1. $string = "ves aquella esquina? ' tu madre y tu hermana ahí trabajan!"; // la cadena podemos ver que tiene una comilla simple '
  2.  

va a ver problemas cuando quiera hacer esto con jQuery
Código
  1. $(selector).html('<p><?php echo($string); ?></p>');
  2.  

me quedará en el html...
Código
  1. $(selector).html('<p>ves aquella esquina? ' tu madre y tu hermana ahí trabajan!</p>');
  2.  

¿Se dieron cuenta del error? Comprendo que hay que escapar esto, pero no se de que manera puedo lograrlo. Tengo un nudo en la cabeza ya, probé un par de cositas pero no me funcionaron.


Título: Re: [Pregunta]: ¿Como podía escapar correctamente esta cadena?
Publicado por: @XSStringManolo en 29 Julio 2020, 23:32 pm
\'


Título: Re: [Pregunta]: ¿Como podía escapar correctamente esta cadena?
Publicado por: Leguim en 29 Julio 2020, 23:39 pm
\'

¿?

No me refiero a solo escapar una ' es decir, quiero escapar esa cadena para que no detecte lo html que sea que haya ahí... desde un $string = '<h6>hola</h6>' hasta un $string = 'esto ' es comilla'

Gracias igualmente!



\'

La solución que encontré usado como base tu respuesta fue:
Código
  1. <div id="box"></div>
  2.  
  3. <?php
  4. $string = "<h6>¿ves aquella esquina? tu madre y ' tu hermana ahí trabajan!</h6>";
  5. $string = str_replace("'", "\'", $string);
  6. $string = str_replace('"', '\"', $string);
  7. $string = htmlspecialchars($string);
  8. ?>
  9.  
  10. <script type="text/javascript">
  11. $('#box').html('<?php echo($string); ?>');
  12. </script>
  13.  

No se si existan maneras mejores pero fue lo que escribí...


Mod: No hacer doble post.


Título: Re: [Pregunta]: ¿Como podía escapar correctamente esta cadena?
Publicado por: EdePC en 30 Julio 2020, 01:27 am
Por supuesto, PHP tiene htmlentities para convertir todos los caracteres posibles a entidades html y htmlspecialchars para solo convertir solo los que puedan causar problemas.

Para ahorrarme en problemas de codificación html mejor usar de una htmlentities y decirle que también convierta las comillas simples y dobles con ENT_QUOTES:

Código
  1. <?php
  2.  $string = "ves aquella esquina? ' tu madre y tu hermana ahí trabajan!";
  3.  $string = htmlentities($string, ENT_QUOTES);
  4. ?>
  5.  
  6. <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  7.  
  8. <div class="hola"></div>
  9.  
  10. <script>
  11.  $(".hola").html('<p><?php echo($string); ?></p>');
  12. </script>

Interpretándose todo como:

Código
  1. <html><head><script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  2.  
  3. </head><body><div class="hola"><p>ves aquella esquina? ' tu madre y tu hermana ahí trabajan!</p></div>
  4.  
  5.  $(".hola").html('<p>ves aquella esquina? &#38;#039; tu madre y tu hermana ah&iacute; trabajan!</p>');

Y mostrando:

Citar
ves aquella esquina? ' tu madre y tu hermana ahí trabajan!

- Y por supuesto que también escapa caracteres de < y > de por ejemplo <p>

Recursos: https://www.php.net/manual/es/function.htmlentities.php


Título: Re: [Pregunta]: ¿Como podía escapar correctamente esta cadena?
Publicado por: WHK en 1 Agosto 2020, 01:59 am
Creo que tu problema va más allá de escapar la cadena, tu problema está en el concepto del uso de cadenas dinámicas desde php hacia una variable de jquery, eso es una pésima práctica.

Código:
	<?php
$string = "<h6>¿ves aquella esquina? tu madre y ' tu hermana ahí trabajan!</h6>";
$string = str_replace("'", "\'", $string);
$string = str_replace('"', '\"', $string);
$string = htmlspecialchars($string);
?>

Eso tiene XSS ya que no estás usando la secuencia de escape de javascript como lo indica el estandar, por lo contrario, solo estas reemplazando algunos caracteres y escapando codigo html en una cadena de tipo javascript, asi que estás doblemente equivocado.

Para comenzar, la etiqueta <h6> no tiene porque venir desde php y pasar por javascript para ser escrito, esto debe ser parte del template de html y no del código dinámico, la frase debe estar en plano sin etiquetas html. Por otro lado, la obtención de la frase debiese ser obtenida a traves de una solicitud ajax o si no a traves de etiquetas ocultas. javascript no puede contener código html y php no debiera entregar valores con html.