Foros del Web » Programando para Internet » PHP »

Filtro para Evitar XSS ayuda

Estas en el tema de Filtro para Evitar XSS ayuda en el foro de PHP en Foros del Web. Hola a Todos, Querria un filtro para evitar XSS en eun formulario de registro en PHP, seria fantastico si ese código se pudiera introducir en ...
  #1 (permalink)  
Antiguo 16/03/2010, 05:46
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Filtro para Evitar XSS ayuda

Hola a Todos,

Querria un filtro para evitar XSS en eun formulario de registro en PHP, seria fantastico si ese código se pudiera introducir en un "PHP" que luego se ponga como "Include" en todas las webs, lo que necesito es algo que remplace o elimine caracteres y palabras concretas.

Mi formulario ya dispone de código que define el tipo de caracter que permite cada celda, pero entiendo que esto seria un refuerzo interesante.

Como ya digo lo ideal seria poder introducir ese código en un archivo independiente de tal forma que todas las paginas lo tomen. Evidentemente tambien necesito la sentencia que debo indicar en el campo del formulario para que llame a ese validador.

Gracias.
  #2 (permalink)  
Antiguo 16/03/2010, 05:50
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Filtro para Evitar XSS ayuda

Cita:
Querria un filtro para evitar XSS en eun formulario de registro en PHP, seria fantastico si ese código se pudiera introducir en un "PHP" que luego se ponga como "Include" en todas las webs, lo que necesito es algo que remplace o elimine caracteres y palabras concretas.
¿No me quedó claro quieres un filtro XSS o un reemplazador de carácteres?
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #3 (permalink)  
Antiguo 16/03/2010, 05:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Filtro para Evitar XSS ayuda

Google: php anti xss function
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 16/03/2010, 05:56
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

Pues cualquiera de las dos opciones que no sea en javascript a poder ser, lo que quiero es evitar de forma centralizada que se usen los campos de formulario (Sea cual sea) para introducir palabras que en cierta medida afecten a la SQL
  #5 (permalink)  
Antiguo 16/03/2010, 06:02
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Filtro para Evitar XSS ayuda

de cualquier forma no existe una función universal para ello, debes ser muy preciso al momento de aplicar la seguridad en tu aplicación...

una función en PHP no solucionaría genéricamente todas tus variables, aún así debes aplicar los filtros con un poco de sentido común a traves de la lógica en tu aplicación...

si fuera algo tan simple como un include estoy seguro de que ya estaría en el core de PHP.... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 16/03/2010, 06:08
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

Hola nuevamente,

Este es el código del Login al administrador, me gustaria me dijerais si os parece bien estructurado o si por el contrario veis alguna forma de securizarlo mejor.

if($procesa == "si"){
$todo_ok = 0;
$sql="SELECT .... WHERE usuario = '$login_usuario' AND password = '$password_usuario'";
$result = mysql_query($sql);
if($row_usuario = mysql_fetch_array($result)){
session_register("usuario_admin_session");
session_register("password_admin_session");
$usuario_admin_session = $row_usuario["usuario"];
$password_admin_session = $row_usuario["password"];
include("mail_accesos.php");
echo ($row_usuario['usuario'])? "<script>top.location.href='./menu.php';</script>":"<script>top.location.href='./index.php';</script>";
}
}
?>

Este es el metodo de envio del formulario del login.
<form action="<?=$PHP_SELF?>?viene=<?=$viene?>" method="POST" enctype="multipart/form-data">

Última edición por xosgon; 16/03/2010 a las 06:09 Razón: Añadido
  #7 (permalink)  
Antiguo 16/03/2010, 06:08
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Filtro para Evitar XSS ayuda

Cita:
Pues cualquiera de las dos opciones que no sea en javascript a poder ser, lo que quiero es evitar de forma centralizada que se usen los campos de formulario (Sea cual sea) para introducir palabras que en cierta medida afecten a la SQL
Eso se soluciona usando al sintaxis SQL apropiada:

SELECT * FROM `Mi_Tabla` WHERE `micampo`= 'mivalor';

Sólo tienes que comprobar que las comillas (') se transformen en \' para que no afecten, pero por lo demás el resto no debería influir.

He visto gente k no pone ninguna clase de comillas ni las raras de mysql `(que son acentos agudos, no comillas), ni las otras.


Luego javascript no puede ser un filtro, nunca, ya que puede estar desactivado o que el usuario lo edite (con el Firebug, por ejemplo, se puede). Otra cosa es que javascript sea un filtro visual. Es un coñazo enviar un formulario y que te lo devuelva por que hay un campo ilegal, si javascript te avisa de que el campo no vale, pues lo corriges antes de enviarlo. Pero si algún listillo desactiva javascript, la página debiera devolverte el mensaje de error desde PHP.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #8 (permalink)  
Antiguo 16/03/2010, 06:18
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

Comprendo, no obstante en el código que pongo arriba del acceso al admin, en una ocasión escribiendo algo como ´0=0´dejaba entrar dando igual el usuario que pongas, en tehoria lo solucionaron, pero no estoy seguro, yo probe hace un rato y saltaba un error de apache que decia:


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/.. on line 21

Evidentemente lo que más me urge securizar es ese login del admin.

Por otro lado mi aplicación tiene las register globals en ON, esto en que afecta a la seguridad de la web...?
  #9 (permalink)  
Antiguo 16/03/2010, 06:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Filtro para Evitar XSS ayuda

Cita:
Iniciado por xosgon Ver Mensaje
Comprendo, no obstante en el código que pongo arriba del acceso al admin, en una ocasión escribiendo algo como ´0=0´dejaba entrar dando igual el usuario que pongas, en tehoria lo solucionaron, pero no estoy seguro, yo probe hace un rato y saltaba un error de apache que decia:


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/.. on line 21
no, en realidad los backticks ` solo sirven para nombrar las columnas y tablas en MySQL y similares...

si tu haces eso definitivamente es un error de sintaxis SQL, porque no se trata de ningún nombre de columna, etc...

Cita:
Iniciado por xosgon Ver Mensaje
Evidentemente lo que más me urge securizar es ese login del admin.

Por otro lado mi aplicación tiene las register globals en ON, esto en que afecta a la seguridad de la web...?
si, es un grave error... lo mejor es trabajar con dicha opción deshabilitada...


ahora... simplemente debes escapar tus variables antes de usarlas... con las funciones definidas para ello (consulta el manual)
Código PHP:
$foo $_GET['bar']; // ' OR 1=1 OR '
$sql "SELECT * FROM tabla WHERE baz='buzz' AND candy='$foo'";
/* SELECT * FROM tabla WHERE baz='buzz' AND candy='' OR 1=1 OR '' */

$foo addslashes($foo); // \' OR 1=1 OR \'
$sql "SELECT * FROM tabla WHERE baz='buzz' AND candy='$foo'";
/* SELECT * FROM tabla WHERE baz='buzz' AND candy='\' OR 1=1 OR \'' */ 
otro caso sencillo es al usar valores INT, lo correcto sería hacer el typecasting necesario...
Código PHP:
$foo = (int) $_GET['bar']; // 13x
$sql "SELECT * FROM tabla WHERE id=$foo";
/* SELECT * FROM tabla WHERE id=13 */ 
al hacer esto aseguramos la integridad y tipo de datos, es un método fiable... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 16/03/2010 a las 06:32 Razón: ejemplos
  #10 (permalink)  
Antiguo 16/03/2010, 06:26
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

siento la molestia pero no lo comprendo, a que te refieres con escapara las variables...?
  #11 (permalink)  
Antiguo 16/03/2010, 06:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Filtro para Evitar XSS ayuda

Cita:
Iniciado por xosgon Ver Mensaje
siento la molestia pero no lo comprendo, a que te refieres con escapara las variables...?
lo siento, es que estaba editando un ejemplo... ;)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 16/03/2010, 06:32
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Filtro para Evitar XSS ayuda

Pasa q hay varias capas de seguridad, y aunq empezaste el post preguntando por filtros anti XSS, el tema ha derivado en filtros anti enjection SQL.
Para "escapar" las variables, es decir limpiarlas antes de pasarlas a las consultas existen funciones como mysql_real_escape_string, puedes consultar el manual en php.net.
Puesto q creo q lo de los filtros XSS son otra cosa
salu2
  #13 (permalink)  
Antiguo 16/03/2010, 06:34
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Ok, lo que no comprendo es la función del $foo, podrias modificar o implementar esa variable al código que yo tengo, de ese modo lo comprenderia mucho mejor. Es decir donde o como iria esa secuencia en mi código de login.

en efecto, el tema varia de su planteamiento original, no obstante el objetivo final es basicamente el mismo, evitar un acceso al admin o en su caso evitar la inserción de ciertos caracteres usando los campos del propio admin login.

Última edición por GatorV; 16/03/2010 a las 09:03
  #14 (permalink)  
Antiguo 16/03/2010, 06:45
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Filtro para Evitar XSS ayuda

Bueno es q ya te lo han ido respondiendo. Mira los links de anti XSS q te dejó pateketrueke, y luego te miras en php.net mysql_real_escape_string. SI tienes más dudas pues posteas
  #15 (permalink)  
Antiguo 16/03/2010, 06:49
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

Comprendo lo que me dicen, no obstante lo único que pido es que al existir ya un código facilitado, poder ver el ejemplo sobre ese código y no sobre un ficticio, pues yo razono la estructura del mio y si veo los cambios sobre el mio puedo comprenderlo. No obstante eulloa no comprendo exactamente tu aportación a este post, para remitirme a un manual del php no es necesario que respondas pues eso ya es evidente.
  #16 (permalink)  
Antiguo 16/03/2010, 07:06
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Filtro para Evitar XSS ayuda

Hombre, es lo que han hecho desde el inicio, pero a veces somos demasiado holgazanes como para estudiar un poquín. Pero bueno concretamente las variables $_POST['usuario'] y $_POST['password'], en el caso de SQL Injection es lo q debes asegurar. Algo como
Código PHP:
Ver original
  1. <?php
  2. $usuario = mysql_real_escape_string( $_POST['usuario']);
  3. $password = mysql_real_escape_string($_POST['password']);
  4.  
  5. //LUEGO DE ESTO ENTONCES LA CONSULTA
  6. $sql="SELECT * FROM tu_tabla WHERE usuario = '$login_usuario' AND password = '$password_usuario'";
  7.  
  8. //Y LO DEMÁS, MYSQL_QUERY, ETC ETC ETC
  9. ?>

Esto debería, en principio, escapar las comillas (q son mayormente las "problemáticas"), para asegurar las consultas. Lo del XSS es otra cosa
  #17 (permalink)  
Antiguo 16/03/2010, 07:19
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Ahora si lo comprendo, ahora tengo 2 dudas:

1º. Esto debo hacerlo en todas las paginas que requieran un login, o simplemente en todos los formularios con una celda en la que se pueda escribir.

2º. Con esos parametros exactamente que conseguimos evitar.

3º. La estructura de las consultas que hago a la db es la siguiente:
$sql="SELECT usuario, password FROM gral_usuarios_admin WHERE usuario = '$login_usuario' AND password = '$password_usuario'";

He visto que dicen por los foros, que es importante que en estas consultas se definan comillas, mi pregunta es, mi forma de hacer la consulta es correcta o debo añadirle algo.

Muchas Gracias,

Lo que no comprendo tampoco es a que se corresponde $usuariao y $password, pues no los uso en ningun otro lado que no sea en donde tu los defines.

Es decir quedaria asi...?


Código PHP:
Ver original
  1. <?
  2. $id_sitio = 1;
  3. include (".........");
  4.  
  5. /*if ((session_is_registered("password_admin_session")) && (session_is_registered("usuario_admin_session"))){
  6.     header("Location: menu.php");
  7. }*/
  8.  
  9. if($procesa == "si"){
  10.     $todo_ok = 0;
  11.     $usuario = mysql_real_escape_string($_POST['usuario']);
  12.     $password = mysql_real_escape_string($_POST['password']);
  13.     //$login_usuario=$HTTP_POST_VARS["login_usuario"];
  14.     //$password_usuario=$HTTP_POST_VARS["password_usuario"];
  15.     //echo "Login:'$login_usuario'";
  16.     //echo "Password:'$password_usuario'";
  17.     $sql="SELECT usuario, password FROM gral_usuarios_admin WHERE usuario = '$login_usuario' AND password = '$password_usuario'";
  18.     //echo $sql;
  19.     $result = mysql_query($sql);
  20.     //$row_usuario = mysql_fetch_array($result);
  21.     //echo $row_usuario['usuario'];
  22.  
  23.     if($row_usuario = mysql_fetch_array($result)){
  24.         //session_unregister();
  25.         session_register("usuario_admin_session");
  26.         session_register("password_admin_session");
  27.         $usuario_admin_session = $row_usuario["usuario"];
  28.         $password_admin_session = $row_usuario["password"];
  29.         //echo "Entro: ".$usuario_admin_session." ".$password_admin_session;
  30.         //header("Location: menu.php");
  31.         include("mail_accesos.php");
  32.         echo ($row_usuario['usuario'])? "<script>top.location.href='./menu.php';</script>":"<script>top.location.href='./index.php';</script>";
  33.         //echo ($row_usuario['u']);
  34.     }
  35.    
  36.    
  37. }
  38. ?>

Última edición por GatorV; 16/03/2010 a las 09:02
  #18 (permalink)  
Antiguo 16/03/2010, 09:19
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Filtro para Evitar XSS ayuda

Cita:
Iniciado por xosgon Ver Mensaje
1º. Esto debo hacerlo en todas las paginas que requieran un login, o simplemente en todos los formularios con una celda en la que se pueda escribir.
Bueno, no solo en las que requieran LOGIN, sino en las q manejen formularios en general que utilices para insertar info en la BD. Consejo Máximo: Nunca confíes en la información del usuario.

Cita:
Iniciado por xosgon Ver Mensaje
2º. Con esos parametros exactamente que conseguimos evitar.
Eso, inyección SQL. Esta función lo que haría es "escapar" las comillas que pasen en los datos del usuario. Imagina que nada impide que en vez de user yo ponga en un text "where 1=1"# o algo parecido. Mira los ejemplos arriba de pateketrueke.

Cita:
Iniciado por xosgon Ver Mensaje
3º. La estructura de las consultas que hago a la db es la siguiente:
$sql="SELECT usuario, password FROM gral_usuarios_admin WHERE usuario = '$login_usuario' AND password = '$password_usuario'";

He visto que dicen por los foros, que es importante que en estas consultas se definan comillas, mi pregunta es, mi forma de hacer la consulta es correcta o debo añadirle algo.
Muchas Gracias,

Lo que no comprendo tampoco es a que se corresponde $usuariao y $password, pues no los uso en ningun otro lado que no sea en donde tu los defines.
Bueno las variables las defines tú, haz entonces $login_usuario = mysql_real_escape_string($_POST['usuario'].
Lo que si no entiendo es la segunda observación, lo de "se definan comillas"

Código PHP:
Ver original
  1. <?
  2. $id_sitio = 1;
  3. include (".........");
  4.  
  5. /*if ((session_is_registered("password_admin_session")) && (session_is_registered("usuario_admin_session"))){
  6.     header("Location: menu.php");
  7. }*/
  8.  
  9. if($procesa == "si"){
  10.     $todo_ok = 0;
  11.     $usuario = mysql_real_escape_string($_POST['usuario']);
  12.     $password = mysql_real_escape_string($_POST['password']);
  13.    
  14.     $sql="SELECT usuario, password FROM gral_usuarios_admin WHERE usuario = '$usuario' AND password = '$password'";
  15.     $result = mysql_query($sql);
  16.    
  17. //COMO OBSERVACIÓN GENERAL, MEJOR USAR $_SESSION Q LAS VERSIONES
  18. //REGISTER
  19.     if($row_usuario = mysql_fetch_array($result)){
  20.         session_register("usuario_admin_session");
  21.         session_register("password_admin_session");
  22.         $usuario_admin_session = $row_usuario["usuario"];
  23.         $password_admin_session = $row_usuario["password"];
  24.    
  25.         include("mail_accesos.php");
  26.         echo ($row_usuario['usuario'])? "<script>top.location.href='./menu.php';</script>":"<script>top.location.href='./index.php';</script>";
  27.         //echo ($row_usuario['u']);
  28.     }
  29.    
  30.    
  31. }
  32. ?>

Aunque no revisé mucho el code
  #19 (permalink)  
Antiguo 16/03/2010, 17:29
(Desactivado)
 
Fecha de Ingreso: marzo-2010
Mensajes: 40
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Filtro para Evitar XSS ayuda

He conseguido que no se pueda acceder con el tipico 'or 1=1 or', con esta modificación del código, podesi decirme si esta bien hecho. La modificación esta en la linea 8.

Código PHP:
Ver original
  1. <?
  2. $id_sitio = 1;
  3. include ("....");
  4.  
  5. if($procesa == "si"){
  6.  $todo_ok = 0;
  7.  
  8.  $sql="SELECT usuario, password FROM gral_usuarios_admin WHERE usuario = '" . mysql_real_escape_string($login_usuario) ."' AND password = '" . mysql_real_escape_string($password_usuario) ."'";
  9.  $result = mysql_query($sql);
  10.  
  11.  if($row_usuario = mysql_fetch_array($result)){
  12.   session_register("usuario_admin_session");
  13.   session_register("password_admin_session");
  14.   $usuario_admin_session = $row_usuario["usuario"];
  15.   $password_admin_session = $row_usuario["password"];
  16.   include("mail_accesos.php");
  17.   echo ($row_usuario['usuario'])? "<script>top.location.href='./menu.php';</script>":"<script>top.location.href='./index.php';</script>";
  18.  }
  19.  
  20. }
  21. ?>

Matices a tener en cuenta:

- La conexión a la DB la toma de un include que llama a un archivo central de configuración.

Última edición por xosgon; 16/03/2010 a las 17:30 Razón: Añadido

Etiquetas: xss, filtros
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 07:11.