Autor Tema: [Ayuda] Evitar inyecciones o bromas  (Leído 1217 veces)

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
[Ayuda] Evitar inyecciones o bromas
« en: 28 de Diciembre de 2010, 21:31:51 pm »
Bueno, pues estoy creando mi página web y al llegar a la sección de noticias y comentarios, me encuentro con el fallo de que si algún usuario o visitante escribe cosas como "<h1>", "<script>", etc... puede fastidiar un poco el uso de mi website.
He probado con htmlentities, pero el problema está en que al usarlo, el archivo que transforma los acentos, hace bbcodes y tal (el tipico funciones.php) deja de funcionar, por ejemplo, muestra <br> en vez de ser usado como salto de línea.
El archivo funciones.php es el siguiente:

<?PHP 
function bbcode($texto){
$texto=nl2br($texto);  
$texto=htmlentities($texto);
/*_-_-_-_-_-_-_-_-_EÑES_-_-_-_-_-_-_-_-_-_-_*/
$texto=str_replace("Ñ",&#39;&ntilde;&#39;,$texto);
$texto=str_replace("ñ",&#39;&Ntilde;&#39;,$texto); 
/*_-_-_-_-_-_-_-_ACENTOS_-_-_-_-_-_-_-_-_-_*/
$texto=str_replace("Á",&#39;&Aacute;&#39;,$texto); 
$texto=str_replace("á",&#39;&aacute;&#39;,$texto); 
$texto=str_replace("É",&#39;&Eacute;&#39;,$texto);
$texto=str_replace("é",&#39;&eacute;&#39;,$texto); 
$texto=str_replace("Í",&#39;&Iacute;&#39;,$texto);
$texto=str_replace("í",&#39;&iacute;&#39;,$texto); 
$texto=str_replace("Ó",&#39;&Oacute;&#39;,$texto);
$texto=str_replace("ó",&#39;&oacute;&#39;,$texto); 
$texto=str_replace("Ú",&#39;&Uacute;&#39;,$texto);
$texto=str_replace("ú",&#39;&Uacute;&#39;,$texto); 
/*_-_-_-_-_-_-_-_BBCODES_-_-_-_-_-_-_-_-_*/
$texto=preg_replace("`\[img](.*)?\[/img\]`is","<img src=\"$1\" />",$texto); 
$texto=preg_replace("`\[url=http://(.*)?\](.*)?\[/url\]`is", &#39;<a href="$1">$2</a>&#39;, $texto);
$texto=preg_replace("`\[b](.*)?\[/b\]`is","<b>$1</b>",$texto); 
$texto=preg_replace("`\[i](.*)?\[/i\]`is","<i>$1</i>",$texto); 
$texto=preg_replace("`\[u](.*)?\[/u\]`is","<u>$1</u>",$texto); 

return 
$texto;
}
?>

¿Alguna solución?
¡Muchas gracias de antemano!

Comunidad PHPeros

[Ayuda] Evitar inyecciones o bromas
« en: 28 de Diciembre de 2010, 21:31:51 pm »

Desconectado Jumarras

  • PHPer@
  • **
  • Mensajes: 73
  • Karma: 3
  • Sexo: Masculino
  • Ten cerca a tus amigos, pero mas a tus enemigos
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #1 en: 29 de Diciembre de 2010, 00:03:31 am »
debajo de "function bbcode($texto){" pon esto:

$texto=nl2br($texto);
$texto = mysql_real_escape_string($texto);
$texto = strip_tags($texto);
$texto = htmlspecialchars($texto);

$texto = stripslashes($texto);

Desconectado GabryWritter

  • PHPerit@
  • *
  • Mensajes: 8
  • Karma: 1
  • Sexo: Masculino
  • Cursando Auxiliar Administrativo 1
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #2 en: 29 de Diciembre de 2010, 00:09:06 am »
¿Inyecciones te refieres a que los usuarios pongan codigos HTML caseros? .
include('config.php');
<?PHP
if ($reformas == "si") {
   echo''La pagina esta en reformas :S";
}
?>

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #3 en: 29 de Diciembre de 2010, 00:10:57 am »
efectivamente Gabry. Por ejemplo: <h1>HOLAAA</h1> <script>alert("Hola")</script>  etc...
Muchas gracias por eso, pero lo único que falla ahora es que los saltos de línea no los cumple, y si que puse el nl2br :S

Desconectado SoyJoaquin.

  • PHPero Master
  • ******
  • Mensajes: 2.737
  • Karma: 131
  • Sexo: Masculino
  • ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ Problem?
    • Ver Perfil
    • IsoMap
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #4 en: 29 de Diciembre de 2010, 02:15:18 am »
efectivamente Gabry. Por ejemplo: <h1>HOLAAA</h1> <script>alert("Hola")</script>  etc...
Muchas gracias por eso, pero lo único que falla ahora es que los saltos de línea no los cumple, y si que puse el nl2br :S

Esta duda la tuve hace muuucho tiempo y la tuve que resolver solo.
A ver, te doy una idea.
Primero crea una variable en el que dicho valor va a ser el mensaje del comentario con un htmlspecialchars().
Después esa variable es donde vas a reemplazar las cosas por ejemplo:

<?php
$comentario 
htmlspecialchars($query[&#39;comentario&#39;]);
$comentario eregi_replace("\\[b\\]([^\\[]*)\\[/b\\]","<b>\\1</b>"$comentario);
echo 
$comentario;
?>


Eso lo que ara es filtrar todos los html que vengan cargados de la query (Que estén guardados en mensaje de la mysql) y después reemplazar los que quieres por un código html que SI va a ejecutarse (Ya que el htmlspecialchars() fue usado antes de mostrar el contenido).

Saludos
Twitter: @JoakoM010



Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #5 en: 29 de Diciembre de 2010, 14:01:20 pm »
eso ya está resulto, el problema que tengo ahora es que no me reconoce los saltos de lineas, y tengo puesto el nl2br($variable);

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #6 en: 29 de Diciembre de 2010, 14:43:24 pm »
eso ya está resulto, el problema que tengo ahora es que no me reconoce los saltos de lineas, y tengo puesto el nl2br($variable);
¿Estás usando un bbcode para el salto de línea? Es que si estás trabajando con bbcode, lo ideal es que nisiquiera tengas que poner un comando para hacer el salto.

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #7 en: 29 de Diciembre de 2010, 15:05:23 pm »
Por favor, lee el primer post bien. Es un sistema de noticias y comentarios, con lo cual uso una función a la que suelo llamar bbcode en la que junto los acentos, los caracteres especiales, los bbcodes, etc.
La cosa está en que en un textbox no reconoce los saltos de linea al insertarlos a la bd y hay que crearlos tu mismo.

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #8 en: 29 de Diciembre de 2010, 17:41:53 pm »
Por favor, lee el primer post bien. Es un sistema de noticias y comentarios, con lo cual uso una función a la que suelo llamar bbcode en la que junto los acentos, los caracteres especiales, los bbcodes, etc.
La cosa está en que en un textbox no reconoce los saltos de linea al insertarlos a la bd y hay que crearlos tu mismo.
Intenta colocando el nl2br($texto); después que el texto pase por todos los filtros. Algo así como la última línea de la función luego de que pasó por los striptags, htmlentities, etc.

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #9 en: 30 de Diciembre de 2010, 14:29:27 pm »
No, eso ya lo intenté... por si sirve de algo, donde debería hacerse el salto de línea aparece esto: rn
por ejemplo: 1linearn2linearn3linearn  (todo en la misma linea, por supuesto :S)
 

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #10 en: 30 de Diciembre de 2010, 15:27:55 pm »
Como dice Physlet, si primero pasas el htmlentities y todos esos filtros y por último pasas el nl2br debería funcionar sin problemas.
Si no te funciona, pega aquí tu nuevo código y fíjate bien que otra función no vuelve a procesar el texto, o que no se procese dos veces por la misma.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #11 en: 30 de Diciembre de 2010, 15:33:49 pm »
Quitando filtros para ver si encontraba cual era el que hacia que no se cumplieran los saltos de línea he averiguado que era este: $texto = mysql_real_escape_string($texto);
Al quitarlo, el código que se me ha quedado así y al parecer funciona perfectamente (omite los tags de HTML al parecer bien):
Código: [Seleccionar]
<?PHP
function bbcode($texto){

$texto = strip_tags($texto);
$texto = htmlspecialchars($texto);
$texto = stripslashes($texto);

/*_-_-_-_-_-_-_-_-_EÑES_-_-_-_-_-_-_-_-_-_-_*/
$texto=str_replace("Ñ",'&ntilde;',$texto);
$texto=str_replace("ñ",'&Ntilde;',$texto);

/*_-_-_-_-_-_-_-_ACENTOS_-_-_-_-_-_-_-_-_-_*/
$texto=str_replace("Á",'&Aacute;',$texto);
$texto=str_replace("á",'&aacute;',$texto);
$texto=str_replace("É",'&Eacute;',$texto);
$texto=str_replace("é",'&eacute;',$texto);
$texto=str_replace("Í",'&Iacute;',$texto);
$texto=str_replace("í",'&iacute;',$texto);
$texto=str_replace("Ó",'&Oacute;',$texto);
$texto=str_replace("ó",'&oacute;',$texto);
$texto=str_replace("Ú",'&Uacute;',$texto);
$texto=str_replace("ú",'&Uacute;',$texto);

/*_-_-_-_-_-_-_-_BBCODES_-_-_-_-_-_-_-_-_*/
$texto=preg_replace("`\[img](.*)?\[/img\]`is","<img src=\"$1\" />",$texto);
$texto=preg_replace("`\[url=(.*)?\](.*)?\[/url\]`is", '<a href="$1">$2</a>', $texto);
$texto=preg_replace("`\[b](.*)?\[/b\]`is","<b>$1</b>",$texto);
$texto=preg_replace("`\[i](.*)?\[/i\]`is","<i>$1</i>",$texto);
$texto=preg_replace("`\[u](.*)?\[/u\]`is","<u>$1</u>",$texto);

$texto = nl2br($texto);

return $texto;
}
?>

Desconectado judoka

  • PHPero Avanzado
  • ****
  • Mensajes: 255
  • Karma: 4
  • Sexo: Masculino
  • Programando hasta lo mas alto.
    • Ver Perfil
Re:[Ayuda] Evitar inyecciones o bromas
« Respuesta #12 en: 03 de Enero de 2011, 16:33:18 pm »
RESUMIENDO: Problema resuelto, gracias por la ayuda ^^ el código final es el del comentario anterior. Pueden cerrar tema.