Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
Cargando

Autor Tema: Script detector de navegador PHP  (Leído 1573 veces)

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

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Script detector de navegador PHP
« en: Mayo 27, 2012, 03:07:47 pm »
Hola a todos! He encontrado x ahí este script k sirve para detectar k navegador está corriendo el cliente k intenta conectarse a nuestro servidor. Esto puede interesarnos por ejemplo a la hora de elegir un exploit específico para un navegador en concreto.
En turquesa las modificaciones y mejoras propuestas en el codigo original.

Lo publico para k me ayudéis a entender mejor como funciona y para ver si entre todos podemos mejorarlo ya k hay algunos navegadores k no detecta.

function ObtenerNavegador($user_agent)

{
 
    $navegadores = array

   (
        'Opera' => '(Opera)',
        'Mozilla Firefox'=> '((Firebird)|(Firefox))',
        'Galeon' => '(Galeon)',
        'Mozilla'=>'(Gecko)',
        'MyIE'=>'(MyIE)',
        'Lynx' => '(Lynx)',
        'Netscape' => '((Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79))',
        'Konqueror'=>'(Konqueror)',
        'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
        'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
        'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
        'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
        'Internet Explorer' => '(MSIE)', // Simplificar Internet Explorer 4,5,6,7... a Internet Explorer
        'Google Chrome' = > '(Chrome)',
   );
   
    foreach($navegadores as $navegador=>$pattern){
        if(preg_match($pattern, $user_agent))
        return $navegador;
    }
   
    return "desconocido";
}
 
echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);


Esta es la parte k no entiendo muy bien:

    foreach($navegadores as $navegador=>$pattern){
        if(preg_match($pattern, $user_agent))
        return $navegador;


Aunque una explicación sencilla de como opera el codigo a nivel general tampoco vendría mal!

Un saludo familia!  :)

EDITO
-----------
Voy a hacer un resumen de lo que hemos sacado en claro para fijar conocimientos y para que quién lea el tema no tenga que ir subiendo y bajando todo el rato. Esto es un resumen de la información que han aportado todos los participantes en el tema.

1. function ObtenerNavegador($user_agent)

Creamos la función ObtenerNavegador y la variable $user_agent. Lo que viene a continuación está dentro de la función ObtenerNavegador.

2. $navegadores = array

    'x' => '(y)'
    ...
    ...

Creamos el vector $navegadores con indice = 'x' y contenido = '(y)'

3. foreach($navegadores as $navegador=>$pattern)

Para poder operar mejor con el índice y el contenido creamos una variable $navegador para referirnos a 'x' (índice) y una variable $pattern para referirnos a '(y)' (contenido)

4. if(preg_match($pattern, $user_agent))
    return $navegador;


- if(preg_match($pattern, $user_agent)) = Busca todos los valores posibles de $pattern (osea de '(y)') dentro del valor de $user_agent y si encuentra una coincidencia
       
        - return $navegador; = Devuelve el valor de $navegador correspondiente a ese valor $pattern. (osea devuelve el valor de
        'x' correspondiente a esa '(y)')

- return "desconocido"; = Si no encuentra ninguna coincidencia nos devuelve desconocido.

5. echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);

Imprimimos el resultado de la función ObtenerNavegador para user_agent = $_SERVER['HTTP_USER_AGENT'] (le pedimos al servidor que nos proporcione el valor de la variable $user_agent (la cabecera user-agent)).

DESGLOSE DE LA EXPRESIÓN $pattern

Vamos a utilizar el ejemplo de Internet Explorer 7 para explicar esta expresión.
La cabecera user-agent de IE7 no nos devuelve un valor exactamente igual al que contiene la viariable $pattern = (MSIE 7\.[0-9]+) cuando se la pedimos. Devolverá algo como MSIE 7.01232141. Entonces, ¿como se comprueba que la cabecera user-agent contiene el valor de $pattern?

$pattern es una expresión regular. Los paréntesis (MSIE 7\.[0-9]+) se usan para agruparla y en este caso se pueden descartar. La parte hasta el 7, osea (MSIE 7\.[0-9]+), tiene que coincidir exactamente con el contenido de la cabecera user-agent. El punto (MSIE 7\.[0-9]+) es un carácter especial en las expresiones regulares (significa que se aceptará cualquier carácter como válido), así que para evitar que interprete eso en vez de un punto normal, hay que meter la barra invertida (MSIE 7\.[0-9]+) que sirve para salirse de la expresión. (MSIE 7\.[0-9]+) indica que se aceptará como válido un caracter entre 0 y 9. Se pueden usar otros conjuntos como [d-k], [adgkq35] o, uno muy común, [a-zA-Z0-9]. Y por último el (MSIE 7\.[0-9]+) indica que el último carácter debe aparecer por lo menos una vez, pero que puede aparecer más veces. Por lo tanto la expresión $pattern busca una linea en la cabecera user-agent que contenga ''MSIE 7.'' seguido por un número del 0 al 9 que obligatoriamente debe estar presente al menos una vez.

if(preg_match($pattern, $user_agent)) Está línea comprueba que la expresión regular $pattern puede generar la cadena $user_agent. Se dice que una expresión regular r genera la cadena s si a partir de r se puede llegar a obtener s.
Por ejemplo, [ab]+ genera las cadenas a, b, aa, ab, ba, bb, aaa...

Si veis algún error corregidme por favor!
Gracias a todos por colaborar :)
« última modificación: Mayo 31, 2012, 06:15:51 pm por odeveku »

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.

Desconectado kid_goth

  • EX-STAFF
  • ***
  • Mensajes: 1365
  • El Conocimiento se Limita Cuando dices NO PUEDO
    • Ver Perfil
    • BlogStudiantes
Re:Script detector de navegador PHP
« Respuesta #1 en: Mayo 27, 2012, 05:49:17 pm »
lo que hace es comparar lo que se le envia con cada valor que esta dentro del array, asi cuando encuentra cual usa lo devuelve y dice cual es... espero me entiendas xD

Recuerda que aunque tu vida haya sido dificil o facil en la muerte encontraras que para todos es igual...
(Justicia Divina)

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #2 en: Mayo 27, 2012, 06:10:04 pm »
jajajajaja sisi, si que te entendí kid, pero ya se lo que hace, lo que quiero saber es como lo hace, osea, que es lo que hace cada parte del script  ;D

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.

Desconectado deivid

  • Éste es mi foro! [L6]
  • *****
  • Mensajes: 663
  • Lo importante es no dejarse de hacer preguntas
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #3 en: Mayo 27, 2012, 06:24:24 pm »
foreach($navegadores as $navegador=>$pattern){
Bueno, esta no se explicarla bien, pero seria algo así:

For each = para cada uno

Entonces lo que hace dicha funcion es crear de  la variable "$navegadores"otra variable "$navegador" a diferencia que la variable $navegador podra imprimir todos los datos de un array

=>$pattern

Es para que al igualmente "invocar" la variable pattern, envesde cojer los "navegadores", coja su sibindice:

'Opera' => '(Opera)',

'Opera' vendria siendo lo que imprimiria "$navegador" y '(Opera)' lo que imprimiria "$pattern"

preg_match

Esta función lo que hace es buscar un caracter en una cadena.

if(preg_match($pattern, $user_agent))

En este caso lo que haria es si el "$pattern" '(Opera)' esta en "$user_agent", imprimira "$navegador", osea
'Opera'.

return($navegador);
Obviamente así, lo imprime.


PD:Bueno, si en algo me equiboque, corrijanmen :D .
"La religión es como el pene. Está bien tener uno, está bien estar orgulloso de él, PERO NO está bien tratar de meterselo a la fuerza a los demás."

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #4 en: Mayo 27, 2012, 06:47:02 pm »
Gracias deivid! Con tu explicación ya casi comprendí el código por completo. Solo me falta una cosa que no entiendo. En que momento le damos a la variable $user_agent la información que contiene? Quiero decir, en que momento le proporcionamos a "$user_agent" la cadena que va a contener el "$pattern" '(Opera)'?

EDITO
-------------
Vale ya está,
echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);
Es ahí cuando "rellenamos" la variable $user_agent con el valor de la cabecera user-agent no?
« última modificación: Mayo 27, 2012, 06:57:52 pm por odeveks »

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.

Desconectado deivid

  • Éste es mi foro! [L6]
  • *****
  • Mensajes: 663
  • Lo importante es no dejarse de hacer preguntas
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #5 en: Mayo 27, 2012, 07:12:47 pm »
Exacto.

ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);

Con lo que esta dentro de la función, te dara unos parametros para ver en que navegador estas corriendo la web, y al tu crear la función "$user_agent", automaticamente cojera el valor $_SERVER['HTTP_USER_AGENT'] , solo que ya sera una variable, y pues podras interactuar con ella mas facilmente.

"La religión es como el pene. Está bien tener uno, está bien estar orgulloso de él, PERO NO está bien tratar de meterselo a la fuerza a los demás."

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #6 en: Mayo 28, 2012, 12:56:04 am »
Gracias por ayudarme a entenderlo!
Ahora alguien se anima a mejorarlo? El script ya está un poco desfasado, y hay algunos navegadores que no reconoce. (Google Chrome, nuevas versiones de IExplorer...)

Por ejemplo, si no me equivoco ahora la versión más nueva de Internet Explorer es la 9 y ahí solo hay hasta la 7. Para incluir la 8 y la 9 bastaría con introducir esto?:

'Internet Explorer 9' => '(MSIE 9\.[0-9]+)',
'Internet Explorer 8' => '(MSIE 8\.[0-9]+)',


Sabeis si se ha mantenido el formato de la cabecera?

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.

Conectado ravenheart

  • Residente de Hack x Crack [L4]
  • ****
  • Mensajes: 329
  • No quiero preguntas técnicas por privado, gracias.
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #7 en: Mayo 29, 2012, 01:30:56 pm »
preg_match
Esta función lo que hace es buscar un caracter en una cadena.
Incorrecto. Lo que hace es comprobar si la expresión regular $pattern puede generar la cadena $user_agent. De expresiones regulares hay mucha literatura en la red. La capacidad expresiva de las expresiones regulares es bastante limitada y yo en general desaconsejo su uso, aunque para este caso en concreto parecen, a primera vista, una buena solución.

Por ejemplo, si no me equivoco ahora la versión más nueva de Internet Explorer es la 9 y ahí solo hay hasta la 7. Para incluir la 8 y la 9 bastaría con introducir esto?:
No lo sé, pero es tan sencillo como imprimir $user_agent y entrar con IE9. Probablemente funcione.
Y para google probablemente sea tan sencillo como ponerle en pattern "Chrome", salvoque necesites saber la versión.

Citar
Ahora alguien se anima a mejorarlo? El script ya está un poco desfasado, y hay algunos navegadores que no reconoce. (Google Chrome, nuevas versiones de IExplorer...)

Yo por lo pronto simplificaría:
        'Internet Explorer 7' => '(MSIE 7)',
        'Internet Explorer 6' => '(MSIE 6)',
        'Internet Explorer 5' => '(MSIE 5)',
        'Internet Explorer 4' => '(MSIE 4)',

No tengo muy claro por qué necesita saber la versión de IE, pero de todos los demás se conforma con saber qué navegador es
You do not need hope if you have drama to back you up.

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #8 en: Mayo 29, 2012, 04:32:50 pm »
Voy a hacer un resumen de lo que hemos sacado en claro para fijar conocimientos y para que quién lea el tema no tenga que ir subiendo y bajando todo el rato.

1. function ObtenerNavegador($user_agent)

Creamos la función ObtenerNavegador y la variable $user_agent. Lo que viene a continuación está dentro de la función ObtenerNavegador.

2. $navegadores = array

    'x' => '(y)'
    ...
    ...

Creamos el vector $navegadores con indice = 'x' y contenido = '(y)'

3. foreach($navegadores as $navegador=>$pattern)

Para poder operar mejor con el índice y el contenido creamos una variable $navegador para referirnos a 'x' (índice) y una variable $pattern para referirnos a '(y)' (contenido)

4. if(preg_match($pattern, $user_agent))
    return $navegador;


Aqui se han comentado 2 posibilidades:

POSIBILIDAD A:

if(preg_match($pattern, $user_agent)) = Busca todos los valores posibles de $pattern (osea de '(y)') dentro del valor de $user_agent y si encuentra una coincidencia
return $navegador; = Devuelve el valor de $navegador correspondiente a ese valor $pattern. (osea devuelve el valor de 'x' correspondiente a esa '(y)')
return "desconocido"; = Si no encuentra ninguna coincidencia nos devuelve desconocido.

POSIBILIDAD B: (esta no la he entenido muy bien así que si cometo algún error corrígeme ravenheart)

if(preg_match($pattern, $user_agent)) = Comprueba que la expresión regular $pattern pueda generar la cadena $user_agent (No sé exactamente que significa esto, si lo puedes aclarar ravenheart te lo agradeceré) y si es así
return $navegador; = Nos devuelve el valor de $navegador que hace posible que $pattern pueda generar la cadena $user_agent.
return "desconocido"; = Si $pattern no genera la cadena $user_agent nos devuelve desconocido.

(No sé muy bien que condiciones hacen que $pattern pueda o no pueda generar la cadena $user_agent, de nuevo si lo puedes aclarar ravenheart te lo agradeceré, espero no abusar de tí  :P)

5. echo ObtenerNavegador($_SERVER['HTTP_USER_AGENT']);

Imprimimos el resultado de la función ObtenerNavegador para user_agent = $_SERVER['HTTP_USER_AGENT'] (le pedimos al servidor que nos proporcione el valor de la variable $user_agent (la cabecera user-agent)).

Si veis algún error corregidme por favor!
Gracias a todos por colaborar :)
« última modificación: Mayo 30, 2012, 04:47:46 pm por odeveku »

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.

Desconectado odeveku

  • Parte de la comunidad [L3]
  • ***
  • Topic Author
  • Mensajes: 200
    • Ver Perfil
Re:Script detector de navegador PHP
« Respuesta #9 en: Mayo 29, 2012, 05:47:27 pm »
Yo por lo pronto simplificaría:
        'Internet Explorer 7' => '(MSIE 7)',
        'Internet Explorer 6' => '(MSIE 6)',
        'Internet Explorer 5' => '(MSIE 5)',
        'Internet Explorer 4' => '(MSIE 4)',

No tengo muy claro por qué necesita saber la versión de IE, pero de todos los demás se conforma con saber qué navegador es

Lo que dices tiene sentido. No es tan importante saber la versión del navegador que corre como el navegador que es, así si simplificamos:

        'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
        'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
        'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
        'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',


a:

        'Internet Explorer' => '(MSIE)'

Siempre nos detectará Internet Explorer sea la versión que sea no?

Todo hombre sabio teme
tres cosas: la tormenta en el mar, la noche
sin luna y la ira de un hombre amable.