Hola,
tengo la siguiente cadena..
$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
$(selector).html('<p><?php echo($string); ?></p>');
me quedará en el html...
$(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.
\'
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:
<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.
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:
<?php
$string = "ves aquella esquina? ' tu madre y tu hermana ahí trabajan!";
$string = htmlentities($string, ENT_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:
<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? ' tu madre y tu hermana ahí 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
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.