[Pregunta]: ¿Como podía escapar correctamente esta cadena?

Iniciado por Leguim, 29 Julio 2020, 23:30 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Hola,

tengo la siguiente cadena..
Código (php) [Seleccionar]

$string = "ves aquella esquina? ' tu madre y tu hermana ahí trabajan!"; // la cadena podemos ver que tiene una comilla simple '


va a ver problemas cuando quiera hacer esto con jQuery
Código (javascript) [Seleccionar]

$(selector).html('<p><?php echo($string); ?></p>');


me quedará en el html...
Código (javascript) [Seleccionar]

$(selector).html('<p>ves aquella esquina? ' tu madre y tu hermana ahí trabajan!</p>');


¿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.

@XSStringManolo


Leguim

#2
Cita de: @XSStringManolo en 29 Julio 2020, 23:32 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!




Cita de: @XSStringManolo en 29 Julio 2020, 23:32 PM
\'

La solución que encontré usado como base tu respuesta fue:
Código (php) [Seleccionar]

<div id="box"></div>

<?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);
?>


<script type="text/javascript">
$('#box').html('<?php echo($string); ?>');
</script>


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


Mod: No hacer doble post.

EdePC

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 (php-brief) [Seleccionar]
<?php 
  $string 
"ves aquella esquina? ' tu madre y tu hermana ahí trabajan!";
  
$string htmlentities($stringENT_QUOTES);
?>


<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

<div class="hola"></div>

<script>
 $(".hola").html('<p><?php echo($string); ?></p>');
</script>


Interpretándose todo como:

Código (html4strict) [Seleccionar]
<html><head><script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

</head><body><div class="hola"><p>ves aquella esquina? ' tu madre y tu hermana ahí trabajan!</p></div>

<script>
 $(".hola").html('<p>ves aquella esquina? &#039; tu madre y tu hermana ah&iacute; trabajan!</p>');
</script></body></html>


Y mostrando:

Citarves 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

WHK

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.

<?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.