SlideShare una empresa de Scribd logo
1 de 68
Descargar para leer sin conexión
HACK X CRACK:           TCP --> COMPRENDIENDO LOS ATAQUES DE INTERNET

                                P
                                P
                                A
                                A   SISTEMA DE DETECCION
                                       DE INTRUSOS !!!
                                S
                                S
                                O
                                O
P A S Oa
P A    a
       a
       a
       a
       a
       a
       aa
        a
        a
        a
        a
        a                           3 SERVIDORES ON LINE PARA TUS PRACTICAS DE HACK


    NÚME RO 21




  * ACCEDIENDO A BASES DE DATOS
   * SISTEMAS ODBC Y API
     * INSTRUCCIONES SQL
    * BASES DE DATOS:
           RELACIONALES
           ORIENTADA A OBJETOS
           EXTENDIDAS


     Nº 21 -- P.V.P. 4,5 EUROS
                        00021




      8 414090 202756

                                     LOS MEJORES ARTÍCULOS GRATIS EN NUESTRA WEB
 P C PA S O A PA S O : P R O G R A M A C I O N W E B C O N B A S E S D E D AT O S
P
                                   A
                                   S
                                   O
               aa
        P A S Oaa
               aa
               a
               a
               aa
                a
                a
                a
                a
                a
                a
                aa

                                                         Director de la Publicación
  EDITORIAL:          EDITOTRANS S.L.                    J. Sentís
  C.I.F:              B43675701
  PERE MARTELL Nº 20, 2º - 1ª                            E-mail contacto
  43001 TARRAGONA (ESPAÑA)                               director@hackxcrack.com
  Director Editorial
  I. SENTIS                                              Diseño gráfico:
  E-mail contacto                                        J. M. Velasco
  director@editotrans.com
  Título de la publicación
  Los Cuadernos de HACK X CRACK.                         E-mail contacto:
  Nombre Comercial de la publicacíón                     grafico@hackxcrack.com
  PC PASO A PASO
  Web: www.hackxcrack.com
  Dirección: PERE MARTELL Nº 20, 2º - 1ª.                Redactores
              43001 TARRAGONA (ESPAÑA)                   AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO,
                                                         ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE,
                                                         ZORTEMIUS, AK22, DORKAN, KMORK, MAILA,
                                                         TITINA, SIMPSIM... ... ... ... ...
  ¿Quieres insertar publicidad en PC PASO A              Contacto redactores
  PASO? Tenemos la mejor relación precio-difusión
  del mercado editorial en España. Contacta con
                                                         redactores@hackxcrack.com
  nosotros!!!
                                                         Colaboradores
  Sr. Ruben Sentis                                       Mas de 130 personas: de España, de Brasil, de
  Tfno. directo: 652 495 607                             Argentina, de Francia, de Alemania, de Japón y
  Tfno. oficina: 877 023 356
  E-mail: miguel@editotrans.com
                                                         algún Estadounidense.
                                                         E-mail contacto
                                                         colaboradores@hackxcrack.com
                                                         Imprime
                                                         I.G. PRINTONE S.A. Tel 91 808 50 15
    4   CURSO DE PHP: A cceso a bases de dat os
   13   CURSO DE T CP/IP:                                DISTRIBUCIÓN:
        T CP ( TRANSMISION C ONTR OL PR O T OC OL. II)   SGEL, Avda. Valdeparra 29 (Pol. Ind.)
                                                         28018 ALCOBENDAS (MADRID)
   35   CURSO DE SEGURIDAD EN REDES: IDS (III)           Tel 91 657 69 00 FAX 91 657 69 28
   62   XB OX (VII): Cr ea tu Sla y er                   WEB: www.sgel.es

                                                         TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80
                                                         Petición de Números atrasados y Suscripciones (Srta. Genoveva)
                                                         HORARIO DE ATENCIÓN:                DE 9:30 A 13:30
                                                                                            (LUNES A VIERNES)
                                                         © Copyright Editotrans S.L.
                                                         NUMERO 21 -- PRINTED IN SPAIN
                                                         PERIOCIDAD MENSUAL
                                                         Deposito legal: B.26805-2002
                                                         Código EAN:      8414090202756


PID E LO S NUMEROS ATRA SADO S EN - - > WWW.HACKXCRA C K .C OM
TRABAJANDO CON BASES DE
                 DATOS EN PHP

              En este número vamos a manejar la base de datos MySQL en PHP. Conocer como se
           programan aplicaciones utilizando Bases de Datos es muy importante, ya que nos permitirá,
           por ejemplo, buscar vulnerabilidades en una Web. Pero todo a su tiempo, primero hay que
                             aprender como va esto de las bases de datos en PHP.


           Aplicaciones Web.                                        páginas dinámicas PHP que se hayan interpretado
                                                                    anteriormente.
           Uno de los aspectos más importantes de cualquier
           lenguaje de programación es el acceso a Bases de         La Base de Datos, como ya hemos mencionado,
           Datos (BBDD). Si unimos la utilidad y la potencia        es donde se encuentra la información. Hay muchos
           de las Bases de Datos a la programación de páginas       tipos de Base de Datos y, para el que no tiene ni
           PHP, podemos programar cualquier aplicación que          idea, haremos un paralelismo con los Sistemas
           nos podamos imaginar.                                    Operativos que nos servirá para entender el siguiente
                                                                    punto.
           La mayoría de los Websites que existen en Internet,
                                                                    Un Sistema Operativo (por ejemplo Windows) puede
           obtienen la información que muestran en sus
                                                                    mostrarnos el contenido del Disco Duro. En LINUX
           páginas accediendo a la información existente en
                                                                    exactamente igual, es un Sistema Operativo que
           una base de datos.
                                                                    es capaz de mostrarnos el contenido del Disco Duro.
                                                                    PERO OJO!!! Aunque con ambos Sistemas Operativos
           Un claro ejemplo de esto son los portales de noticias.
                                                                    obtenemos lo mismo (acceso al contenido del disco
           En ellos, la información publicada se obtiene a
                                                                    duro), la forma en que trabajan internamente es
           través de consultas a la Base de Datos (donde se
                                                                    MUY DISTINTA, por lo tanto, el programa que se
           encuentran las noticias). Pero también existen
                                                                    encarga de acceder y visualizar el contenido del
           Websites en Internet que insertan, modifican e
                                                                    disco duro en Windows es totalmente distinto al de
           incluso eliminan datos de una Base de Datos, como
                                                                    Linux.
           por ejemplo una librería on-line, en ella se insertan
           datos de los clientes, se actualiza el stock de los      En las Bases de Datos es exactamente igual. Hay
           pedidos realizados…                                      Bases de Datos de muchos fabricantes distintos
                                                                    (Oracle, SQL, R3…), nosotros podemos tener
           Arquitectura Web - BBDD
                                                                    nuestros datos en Oracle, en SQL o en R3, pero
           En una Aplicación Web que accede a una base de           para acceder a ellos necesitaremos instrucciones
           datos necesitamos los siguientes elementos:              distintas.
             El navegador del cliente.
             El servidor de páginas HTML y PHP                      La Base de Datos necesita tener un canal de
             El protocolo HTTP que se encarga de comunicar          comunicación con el Servidor Web encargado de
           al navegador y al Servidor Web.                          procesar las páginas. Esta comunicación se puede
              La Base de Datos, donde se encuentra la               realizar de dos formas diferentes:
           información que se maneja en la aplicación.                ODBC (Open Database Connectivity): permite
             Canal de Comunicación: Los mecanismos (ODBC,            que una Aplicación Web se conecte a cualquier
           API de BBDD) necesarios para comunicar al servidor       base de datos que soporte ODBC. Si la base de
           web con la base de datos… … no te asuste tanta           datos cambia, no hay que cambiar la programación,
           sigla que ahora lo veremos con detalle.                  ya que la forma de acceder a la información por
                                                                    ODBC es la misma para cualquier motor de Base
           El usuario utiliza el navegador o browser tanto          de Datos que soporte ODBC. Como ya vimos antes,
           para enviar como para recibir las páginas Web. El        si Oracle, SQL y R3 soportasen ODBC, las
           usuario envía las páginas al Servidor Web y recibe       instrucciones de acceso a los datos serían las mismas
           las páginas del Servidor Web a través del protocolo.     (y todos contentos).
                                                                      API (Application Programming Interface):
           El Servidor Web se encarga atender las peticiones
                                                                    conjunto de funciones que forman parte de la
           del usuario (solicitud de páginas), procesarlas y
                                                                    interfaz de acceso a una Base de Datos. Si la
           devolverle el resultado. Este Servidor Web será
                                                                    base de datos cambia, hay que cambiar la
           capaz de servir tanto páginas estáticas HTML como


Página 4                                                                                                    PC PASO A PASO Nº 21
Programación PHP - Programación PHP - Programación PHP - Programación PHP




          programación, ya que la API que accede a otra          En el presente curso trabajaremos con la base de
          base de datos será diferente. Por ejemplo, las API     datos MySQL por su integridad con PHP. PHP permite
          de MySQL y Oracle son totalmente diferentes.           trabajar con las bases de datos más utilizadas, ya
                                                                 sea utilizando su propia librería de funciones (API)
          En muchos casos también es posible utilizar ambas      o realizando la conexión mediante un enlace ODBC.
          formas de acceso a una base de datos, éste es el       El soporte de base de datos en PHP incluye algunas
          caso de MySQL. Si tenemos los drivers necesarios       como Oracle, MySQL, PostgreSQL, Sybase, ...
          para acceder a MySQL a través de ODBC, podemos
          utilizar el conjunto de funciones ODBC que incluye     Instrucciones SQL
          PHP. Pero también es posible acceder a esta base       El lenguaje SQL (Structured Query Language) es
          de datos a través de su propia API.                    el lenguaje estándar que se utiliza para manipular
                                                                 la información que contienen las bases de datos
          Si accedemos a la base de datos a través de la         relacionales.
          API, la rapidez de acceso será mucho mayor que         No vamos a entrar en profundidad en el lenguaje
          si accedemos a ella a través de ODBC, ya que ODBC      SQL, ya que esto nos llevaría un tiempo considerable.
          deberá transformar las instrucciones generadas por     Pero si que vamos a contemplar los conceptos
          PHP a otras que entienda MySQL, haciendo por lo        básicos necesarios para realizar una Aplicación Web.
          tanto más lento el proceso.

          Bases de Datos                                         Seleccionar
          Las Bases de Datos (sean del “fabricante” que sean)
          pueden ser:                                            Para seleccionar registros en una base de datos
            Bases de Datos Relacionales (RDBMS, Relation         utilizaremos la instrucción SELECT. Veremos el
          Database Management Systems): son las más              funcionamiento de la instrucción SELECT a lo largo
          utilizadas. Los datos se almacenan en diferentes       de los siguientes ejemplos.
          tablas, que a su vez están compuestas por registros
          (filas), columnas y campos. Existen una gran           Los ejemplos que se van a mostrar van a actuar
          variedad de BBDD relacionales en el mercado:           sobre las siguientes tablas:
          Access, SQL Server, Oracle, ...
            Bases de Datos Orientadas a Objetos (ODBMS,
          Object Oriented DBMS): el dato es representado
          como un objeto con sus correspondientes
          propiedades y métodos. Algunas de estas bases de
          datos son ObjectStore, Versant, GemStone, ...
            Bases de Datos Extendidas (ORDBMS, Object
          Relational DBMS): reúne las características de los
          dos tipos de bases de datos anteriores. Un ejemplo
          de este tipo de bases de datos es PostgreSQL.

          De entre todas las bases de datos que existen en
          el mercado MySQL forma la pareja perfecta con
          PHP. Existen versiones de MySQL tanto para Linux
          / Unix como para Windows, por lo tanto PHP-MySQL
          se puede utilizar sobre cualquier plataforma.
                                                                 //Selecciona todos los campos de la tabla alumnos
          MySQL es una base de datos ideal para aplicaciones     SELECT * FROM ALUMNOS;
          de tamaño pequeño o medio. Su funcionamiento se
          basa en ejecutar primero un programa residente. Su     Y el resultado obtenido es:
          manejo es a través de la línea de comandos y soporta
          el lenguaje SQL y conexiones a través de ODBC nivel
          0-2.

          MySQL almacena cada una de las tablas de la base
          de datos en un fichero separado. El tamaño máximo
          de estos ficheros es de 4Gb y la limitación impuesta
                                                                 //Selecciona el nombre y el apellido de la tabla alumnos
          por el sistema operativo y la capacidad de nuestro
          disco duro.                                            SELECT NOMBRE, APELLIDO FROM ALUMNOS;



PC PASO A PASO Nº 21                                                                                                        Página 5
Programación PHP - Programación PHP - Programación PHP - Programación PHP



                                                                       Para ordenar los resultados obtenidos añadiremos
 Donde NOMBRE y APELLIDO son                                           al final de la consulta la opción ORDER BY y a
 campos de la tabla y van separados
                                                                       continuación los campos por los que queramos
 por comas (,)
                                                                       ordenar y el sentido de la ordenación ASC
 Y el resultado obtenido es
                                                                       (ascendente) y DESC (descendiente).


                                                                       //Selecciona todos los capos de la tabla alumnos
            //Selecciona el nombre y el apellido de la tabla alumnos
                                                                       //cuyo curso sea el C1 y los ordena por su edad
            //cuyo país sea España
                                                                         SELECT * FROM ALUMNOS
              SELECT NOMBRE, APELLIDO, PAIS
                                                                         WHERE CURSO = ‘C1’ ORDER BY EDAD ASC;
              FROM ALUMNOS
              WHERE PAIS = ‘España’;
                                                                       Y el resultado obtenido es:
            Donde NOMBRE, APELLIDO y PAIS son campos
            de la tabla y la opción WHERE filtra por los criterios
            deseados, en este caso cuyo PAIS de procedencia
            sea España. Cuando comparemos con una cadena,
            ésta debe ir rodeada de comillas simples (‘).
                                                                       Utilizando la opción LIKE en vez del operador =
            Y el resultado                                             podremos comparar parte de una cadena.
            obtenido es:
                                                                       //Selecciona todos los capos de la tabla alumnos
            Podemos añadir los operadores lógicos AND y OR             //cuyo nombre contenga la letra “a”
            a la opción WHERE y de esta forma obtendremos                SELECT * FROM ALUMNOS
            filtros con diferentes condiciones.
                                                                         WHERE NOMBRE LIKE ‘%a%’;
            //Selecciona todos los capos de la tabla alumnos
                                                                       //Selecciona todos los capos de la tabla alumnos
            //que tengan menos de 30 años y cuyo país sea España
                                                                       //cuyo nombre empiece la cadena “Da”
              SELECT * FROM ALUMNOS
                                                                         SELECT * FROM ALUMNOS
              WHERE EDAD < 30 AND PAIS = ‘España’;
                                                                         WHERE NOMBRE LIKE ‘Da%’;
            Y el resultado obtenido es:
                                                                       //Selecciona todos los capos de la tabla alumnos
                                                                       //cuyo nombre termine con la letra “a”
                                                                         SELECT * FROM ALUMNOS
                                                                         WHERE NOMBRE LIKE ‘%a’;
            Ahora vamos a relacionar la tabla ALUMNOS y
            CURSOS para obtener los alumnos junto al curso             Con LIKE ‘%cadena%’ selecciona registros cuya
            que realizan. Para realizar esta relación                  “cadena” esta contenida dentro del campo a
            correctamente las tablas deben tener un campo              comparar.
            de relación que en este caso es el campo “CURSO”
            de la tabla ALUMNOS con el CODIGO de la tabla              Con LIKE ‘cadena%’ selecciona registros cuya
            CURSOS.                                                    “cadena” empieza por campo a comparar.

            //Selecciona el nombre, el apellido de la tabla alumnos    Con LIKE ‘%cadena’ selecciona registros cuya
             // y el curso de la tabla cursos                          “cadena” termina por campo a comparar.
             SELECT ALUMNOS.NOMBRE, ALUMNOS.APELLIDO, CURSOS.CURSO
             FROM ALUMNOS, CURSOS                                      Si sabemos de antemano que la ejecución de una
             WHERE ALUMNOS.CURSO = CURSOS.CODIGO;                      sentencia de selección va a devolver una gran
                                                                       cantidad de registros, se puede limitar esta cantidad
            Y el resultado obtenido es:
                                                                       de registros.
                                                                       //Devuelve solo los 10 primeros registros de la selección
                                                                         SELECT * FROM ALUMNOS LIMIT 10;
                                                                       //Devuelve 15 registros a partir de la posición 30
                                                                         SELECT * FROM ALUMNOS LIMIT 30,15;



Página 6                                                                                                          PC PASO A PASO Nº 21
Programación PHP - Programación PHP - Programación PHP - Programación PHP




          Actualizar                                                        Si queremos modificar todos los registros de una
                                                                            tabla, simplemente no deberemos añadir la opción
                                                                            WHERE a la instrucción UPDATE.
          Para conseguir modificar el contenido de una base
          de datos utilizaremos la instrucción UPDATE.
          Comprenderemos mejor su funcionamiento a través                   //Modifica el contenido de la edad de María de la tabla alumnos
          de los siguientes ejemplos.                                        UPDATE ALUMNOS SET EDAD = 25

          Si queremos modificar el contenido de un campo
                                                                            Y el resultado obtenido es:
          de un registro en concreto utilizaremos la instrucción
          UPDATE seguida de la opción WHERE para filtrar
          el registro que queremos modificar.

          //Modifica el contenido de la edad de María de la tabla alumnos
            UPDATE ALUMNOS SET EDAD = 25 WHERE CODIGO = ‘A1’;

          Y el resultado obtenido es:

                                                                            Insertar
                                                                            Para añadir o insertar nueva información en una
                                                                            base de datos utilizaremos la instrucción INSERT.
                                                                            Veremos el funcionamiento de INSERT a través de
                                                                            los siguientes ejemplos.

          Si queremos modificar más de un campo del mismo
          registro, añadiremos tantos campo=valor separados                 //Añade un registro a la tabla alumnos
          por comas, como campos queramos modificar.                          INSERT INTO ALUMNOS
                                                                              (CODIGO, NOMBRE, APELLIDO, PAIS, EDAD, CURSO)
          //Modifica el contenido de la edad de María de la tabla alumnos     VALUES (‘A5’, ‘Sabina’, ‘Campoy’, ‘España’, 17, ‘C1’);
           UPDATE ALUMNOS SET EDAD = 25, CURSO = ‘C2’
           WHERE CODIGO = ‘A1’;                                             Y el resultado obtenido es:


          Y el resultado obtenido es:




                                                                            Es importante recordar el tipo de dato que puede
                                                                            almacenar cada campo. Las inserciones de datos
          Si queremos modificar más de un registro al mismo
                                                                            tipo string deben ir entre comillas, en cambio los
          tiempo en la opción WHERE deberemos aplicar un
                                                                            de tipo numérico no.
          filtro que afecte a más de un registro.

                                                                            En el uso de INSERT no es necesario especificar
          //Modifica el contenido de la edad de María                       ningún filtro (WHERE), ya que la inserción no afecta
          //de la tabla alumnos                                             a ningún registro en particular, si no que afecta a
            UPDATE ALUMNOS SET EDAD = 25                                    una tabla específica.
            WHERE CURSO = ‘C1’;
                                                                            Borrar
          Y el resultado obtenido es:

                                                                            La instrucción DELETE borra un determinado registro
                                                                            de una tabla, para especificar los registros que
                                                                            queremos eliminar lo haremos añadiendo la opción
                                                                            WHERE. Al igual que con la instrucción UPDATE, si
                                                                            no se especifica la opción WHERE, el borrado afectará
                                                                            a todos los registros de la tabla.


PC PASO A PASO Nº 21                                                                                                                          Página 7
Programación PHP - Programación PHP - Programación PHP - Programación PHP




           //Elimina al alumno A2
             DELETE FROM ALUMNOS WHERE CODIGO = ‘A2’;            En el caso de que se haga una llamada a
                                                                 mysql_connect() con los mismos argumentos, no
           //Elimina a los alumnos del curso C1
                                                                 se establecerá un nuevo enlace, sino que se
             DELETE FROM ALUMNOS WHERE CURSO = ‘C1’;             devolverá el enlace ya abierto. Esto consigue
           //Elimina a todos los alumnos                         optimizar recursos, ya que más de un enlace abierto
             DELETE FROM ALUMNOS;                                solo consumiría más recursos para obtener los
                                                                 mismos resultados.
           PHP – BBDD (MySQL)
                                                                 El enlace al servidor se cerrará tan pronto como la
           PHP dispone de un conjunto de funciones que           ejecución del script PHP finalice, es decir cuando
           forman la API que permite utilizar la base de datos   termine la ejecución de la página PHP, a menos que
           MySQL. Estas funciones se encuentran optimizadas      se cierre antes explícitamente llamando a
           para sacar el máximo rendimiento a MySQL, por         mysql_close().
           lo tanto serán mucho más rápidas que acceder a
           MySQL a través de ODBC. La lista de funciones en      En el siguiente ejemplo se muestra el proceso de
           PHP que manejan el API de MySQL es muy amplia,        conexión a un servidor MySQL que está en la misma
           a continuación veremos las funciones más              máquina (localhost) donde está el Servidor Web. El
           importantes. El listado completo de todas las         usuario es “pepe” y la contraseña es “12colina34”
           funciones lo podemos encontrar en la página web
           oficial de PHP (www.php.net).                         mysql_connect(“localhost”, “pepe”, “12colina34”);

           mysql_connect                                         Si el puerto es diferente al puerto por defecto y no
                                                                 es necesario especificar el usuario y password:
           Abre una conexión a un servidor MySQL
                                                                 mysql_connect(“localhost:3345”, “”, “”);
           La sintaxis de la función es la siguiente:
           int mysql_connect ( [string servidor [string          Lo más práctico a la hora de realizar aplicaciones
           :puerto/path_to_socket] [, string usuario [, string   es declarar la conexión a la base de datos en un
           password]]])                                          fichero php independiente y después incluir este
                                                                 fichero en aquellas páginas que necesiten una
           La función devuelve un valor numérico de tipo int
           que identifica la conexión con el servidor MySQL.     conexión a la base de datos.
             Servidor: nombre o dirección IP del servidor
           donde está la base de datos.                          <?php
             Puerto: puerto por el que se accede a la base de    $servidor = “127.0.0.1”;
           datos.
                                                                 $usuario = “root”;
             Path_to_socket: el socket que el servidor está
           utilizando para escuchar las peticiones (sólo en      $clave = “admin”;
           Unix)                                                 $miconexion = mysql_connect($servidor, $usuario,
             Usuario: nombre del usuario para realizar la        $clave);
           conexión a la base de datos.                          ?>
             Password: clave del usuario para realizar la
           conexión a la base de datos.
                                                                 Si al ejemplo anterior lo llamamos “conexion.php”
           La función mysql_connect() establece una conexión     deberemos incluir el siguiente código en nuestras
           a un servidor MySQL. Todos los argumentos son         páginas:
           opcionales, y si no se especifican, se asumen los
           valores por defecto:                                  <?php
             servidor: localhost                                 include (“conexion.php”);
             puerto: 3306
                                                                 ?>
             path_to_socket: /tmp/mysql.sock
             usuario: usuario propietario del proceso del
                                                                 Para poder conectarnos a la base de datos, debemos
           servidor
                                                                 indicar en los parámetros de la conexión un usuario
             password: password vacia.
                                                                 y contraseña válidos y existentes como usuarios en
           El servidor también puede incluir un número de        la base de datos. Recuerda que en el tema anterior
           puerto (localhost:3306) o un camino al socket         aprendimos una administración básica de la MySQL
           (:/camino/al/socket) para localhost.                  a través de phpmyadmin.



Página 8                                                                                                     PC PASO A PASO Nº 21
Programación PHP - Programación PHP - Programación PHP - Programación PHP




          mysql_select_db                                            Sentencia: la sentencia SQL que será enviada al
                                                                   servidor para su ejecución.
          Selecciona la base de datos con la que se va a             Identificador_conexión: el identificador de la
          trabajar de entre todas las existentes en el servidor.   conexión sobre la que el comando de SQL será
                                                                   enviado al servidor de la base de datos.
          La sintaxis de la función es la siguiente:
                                                                   La función mysql_query() envía una sentencia a la
          int mysql_select_db ( string base_de_datos [, int
                                                                   base de datos activa en el servidor asociada al
          identificador_de_enlace])
                                                                   identificador de enlace. Si no se especifica un
                                                                   identificador_conexion, se asumirá el último enlace
          Devuelve TRUE si éxito, FALSE si error.
                                                                   abierto. Si no hay ningún enlace abierto, la función
          Los argumentos de la función son:
                                                                   intenta establecer un enlace como si se llamara
            Base_de_datos: nombre de la base de datos a
                                                                   función mysql_connect() sin argumentos, y lo utiliza.
          seleccionar.
            Identificador_conexión: identificador de la            La función mysql_query() devuelve TRUE (no-cero)
          conexión.                                                o FALSE para indicar si la sentencia se ha ejecutado
                                                                   correctamente o no. Un valor TRUE significa que
          <?php                                                    la sentencia era correcta y pudo ser ejecutada en
          mysql_select_db(“pruebas”, $miconexion);                 el servidor. No indica nada sobre el número de fila
                                                                   devueltas. Es perfectamente posible que la sentencia
          ?>
                                                                   se ejecute correctamente pero que no devuelve
                                                                   ninguna fila.
          La función mysql_select_db() establece la base de
          datos activa que estará asociada con el identificador
                                                                   <?php
          de conexión especificado. Si no se especifica un
                                                                   $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”;
          identificador de conexión, se asume el ultimoúltimo
                                                                   $id_query = mysql_query($consulta, $miconexion);
          enlace abierto. Si no hay ningún enlace abierto, la
          función intentará establecer un enlace como si se        ?>
          llamara a mysql_connect().
                                                                   Asumiendo que la sentencia tenga éxito, se puede
                                                                   llamar a mysql_affected_rows() para saber cuantas
          Ahora modificaremos el include conexión para
                                                                   filas fueron afectadas (para DELETE, INSERT,
          añadirle la línea de selección de la Base de Datos
                                                                   REPLACE, o UPDATE). Para las sentencias SELECT,
          donde hemos dado de alta las tablas ALUMNOS y
                                                                   mysql_query() devuelve un nuevo identificador de
          CURSOS.
                                                                   resultado que se puede pasar a mysql_result().
                                                                   Cuando se acabe de utilizar el resultado, se pueden
          <?php                                                    liberar los recursos asociados utilizando
          $servidor = “127.0.0.1”;                                 mysql_free_result().
          $usuario = “root”;
          $clave = “admin”;                                        mysql_result
          $miconexion = mysql_connect($servidor, $usuario,
                                                                   Devuelve el dato solicitado de un identificador
          $clave);                                                 generado por la sentencia mysql_query.
          mysql_select_db(“aprende_php”, $miconexion);             La sintaxis de la función es la siguiente:
          ?>                                                       int mysql_result ( int id_consulta, int numero_de_fila
                                                                   [, mixed campo])
          mysql_query                                              Los argumentos de esta función son:
                                                                      Id_consulta: es el identificador de la consulta
          Envía una sentencia SQL a MySQL para que
                                                                   realizada con mysql_query()
          se ejecute                                                 Numero_de_fila: fila a la que se accede para leer
                                                                   el dato.
          La sintaxis de la función es la siguiente:                 Campo: campo de la fila que se quiere obtener.
          int mysql_query ( string sentencia [, int
                                                                   La función mysql_result() devuelve el contenido de
          identificador_conexión])                                 una celda de un resultado MySQL. El argumento
                                                                   campo puede ser el nombre del campo o
          Los argumentos utilizados en esta función                tabla.nombre_del_campo. Si el nombre de la
          son:                                                     columna tiene un alias (campo as campo1),



PC PASO A PASO Nº 21                                                                                                        Página 9
Programación PHP - Programación PHP - Programación PHP - Programación PHP




               utilizaremos el alias en lugar del nombre de la                  <?php
               columna.                                                         include (“conexion.php”);
                                                                                $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”;
               <?php                                                            $id_query = mysql_query($consulta, $miconexion);
               include (“conexion.php”);                                        while ($fila = mysql_fetch_array($id_query)) {
               $consulta = “SELECT NOMBRE, APELLIDO FROM                          print(“Nombre:” . $fila[“NOMBRE”] . “<br>”);
               ALUMNOS”;                                                        }
               $id_query = mysql_query($consulta, $miconexion);                 ?>
               $result1 = mysql_result($id_query, 1, 1); // fila 1, columna 1
               $result2 = mysql_result($id_query, 2, 1); // fila 2, columna 1           Al ejecutar el código anterior obtenemos
               print(“result1: ” . $result1 . “<br>”);                                  el siguiente resultado:
               print(“result2: ” . $result2 . “<br>”);
               ?>                                                               Para acceder a los datos se
                                                                                utiliza como índice del array
                                                                                el nombre del campo que lo
               Para operar con la función mysql_result() debemos
                                                                                identifica o bien la posición
               imaginarnos el resultado de la consulta como una
                                                                                que ocupa en la selección.
               matriz:
                                                                                Devuelve un array que
                                                                                corresponde al resultado de
                                                                                la consulta, o FALSE si no
                                                                                quedan más filas.

                                                                                La función mysql_fetch_array() es una versión
                                                                                extendida de mysql_fetch_row(). Además de guardar
                                                                                los datos en el índice numérico de la matriz, guarda
                                                                                también los datos en los índices asociativos, usando
El resultado de ejecutar el ejemplo anterior es:
                                                                                el nombre de campo como clave.

                                          Cuando se trabaja con un              Si dos o más columnas del resultado tienen el mismo
                                          gran resultado, debe
                                                                                nombre de campo (puede pasar al relacionar tablas),
                                          considerarse la utilización de
                                                                                la última columna toma la prioridad. Para acceder
                                          una función que devuelva una
                                                                                a la(s) otra(s) columna(s) con el mismo nombre,
                                          fila entera ya que estas
                                          funciones son MUCHO mas               se debe especificar el índice numérico o definir un
                                          rápidas que mysql_result().           alias para la columna.
                                          Especificando un offset
                                                                                La función mysql_fetch_array() no es
                                          numérico en lugar del
                                          n o m b r e d e l c a m p o, l a      significativamente mas lenta que mysql_fetch_row(),
                                          ejecución será mas rápida.            sin embargo tiene un valor añadido importante.

               Las llamadas a mysql_result() no deben mezclarse
               con llamadas a las otras sentencias que trabajan                 mysql_num_rows
               con un identificador de resultado.
                                                                                Devuelve el número de filas de un resultado La
               mysql_fetch_array                                                sintaxis de la función es la siguiente:
                                                                                int mysql_num_rows ( int id_resultado)
               Extrae la fila de resultado como un array asociativo.
               La sintaxis de la función es la siguiente:
                                                                                La función mysql_num_rows() devuelve el numero
               array mysql_fetch_array ( int id_resultado [,                    de filas de un identificador de resultado.
               int tipo_de_resultado])
                                                                                En el siguiente ejemplo utilizaremos el número de
               Los argumentos de la función son:
                                                                                filas seleccionadas para crear un bucle e ir mostrando
                 Id_resultado: identificador de resultado devuelto
                                                                                el valor del campo “nombre” de todas las filas
               por mysql_query().
                                                                                seleccionadas. Utilizamos la variable del bucle $i
                 Tipo_de_resultado: constante que indica el tipo
               de array que devuelve. Puede tomar los valores                   para indicar la fila en mysql_result().
               MYSQL_NUM, MYSQL_ASSOC y MYSQL_BOTH.


 Página 10                                                                                                               PC PASO A PASO Nº 21
Programación PHP - Programación PHP - Programación PHP - Programación PHP


<?php                                                               <?php
include (“conexion.php”);                                           include (“conexion.php”);
$consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”;                 $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”;
$id_query = mysql_query($consulta, $miconexion);                    $id_query = mysql_query($consulta, $miconexion);
$filas = mysql_num_rows($id_query);                                 $campo = mysql_field_name($id_query, 0);
for ($i=0; $i<$filas; $i++) {                                       print(“campo: ” . $campo . “<br>”);
  $campo = mysql_result($id_query, $i, “NOMBRE”);                   ?>
  print(“campo ” . ($i + 1) . “: ” . $campo . “<br>”);              Al ejecutar el código anterior
}                                                                   obtenemos el siguiente resultado:
?>
                                                                    Por razones de compatibilidad puede
Al ejecutar el código anterior                                      usarse       tambientambién
obtenemos el siguiente                                              mysql_fieldname().
resultado:
                                                                    mysql_field_type
Por razones de compatibilidad
puede usarse también                                                Devuelve el tipo de dato del campo especificado en un resultado.
mysql_numrows().                                                    La sintaxis de la función es la siguiente:
                                                                    string mysql_field_type ( int id_resultado, int indice_del_campo)
mysql_field_name                                                    La función mysql_field_type() es similar a la función
Devuelve el nombre del campo especificado en un resultado La        mysql_field_name(). Los argumentos son idénticos, pero se
sintaxis de la función es la siguiente:                             devuelve el tipo de campo. El tipo será "int", "real", "string",
string mysql_field_name ( int id_resultado, int indice_del_campo)   "blob", u otros detallados en la documentación de MySQL.

La función mysql_field_name() devuelve el nombre del campo          <?php
especificado. Los argumentos de la función son el identificador     include (“conexion.php”);
de resultado y el índice del campo. Devolverá el nombre del         $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”;
campo asociado.                                                     $id_query = mysql_query($consulta, $miconexion);
                                                                    $tipo = mysql_field_type($id_query, 0);
                                                                    print(“tipo: ” . $tipo . “<br>”);
                                                                    ?>
Programación PHP - Programación PHP - Programación PHP - Programación PHP



            Al ejecutar el código anterior obtenemos el siguiente    mysql_errno
            resultado:
                                 Por razones de compatibilidad       Deuelve el número del mensaje de error de la última
                                 puede usarse también                operación MySQL. La sintaxis de la función es:
                                 mysql_fieldtype().                  int mysql_errno ( [int identificador_conexion])

                               mysql_create_db                       <?php
                                                                     include (“conexion.php”);
                               Crea una nueva base de datos          $consulta = “SELECT NOMBRE, APELLIDO FROM
                               MySQL después de haber                ALUMNOOS”;
                               realizado una conexión al
                                                                     $id_query = mysql_query($consulta, $miconexion);
                               servidor. La sintaxis de la función
                               es la siguiente:                      print(“Error: ” . mysql_errno($miconexion) . “<br>”);
                                                                     ?>
            int mysql_create_db ( string base_de_datos [, int        Al ejecutar el código anterior
            identificador_conexion])                                 obtenemos el siguiente
                                                                     resultado:
            Los argumentos utilizados en esta función son:
              Base_de_datos: nombre de la base de datos a            La ejecución del ejemplo
            crear.                                                   anterior generará un error
              Identificador_conexión: identificador de la            debido a que la tabla
            conexión.                                                ALUMNOS está mal escrita.

            La función mysql_create_db() intenta crear una
            nueva base de datos en el servidor asociado al           mysql_error
            identificador de conexión.
                                                                     Devuelve el texto del mensaje de error de la última
                                                                     operación MySQL. La sintaxis de la función es la
            <?php
                                                                     siguiente:
            mysql_create_db(“pruebas”, $miconexion);                 string mysql_error ( [int identificador_de_enlace])
            ?>
                                                                     Los errores devueltos por mySQL no se indican en
            Por razones de compatibilidad puede usarse               los warnings, Por lo tanto debemos usar estas
            mysql_createdb() igualmente.                             funciones para encontrar el número de error.
                                                                     <?php
            mysql_drop_db                                            include (“conexion.php”);
                                                                     $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOOS”;
            Borra una base de datos MySQL. La sintaxis de la         $id_query = mysql_query($consulta, $miconexion);
            función es la siguiente:                                 print(“Error”.mysql_errno($miconexion).“:”.mysql_error($miconexion).“<br>”);
            int mysql_drop_db ( string base_de_datos [, int          ?>
            identificador_conexion])

                                                                     Al ejecutar el código anterior obtenemos el
            Devuelve TRUE si éxito, FALSE si error.                  siguiente resultado:

            Los argumentos de la función son:                        En el próximo
              Base_de_datos: nombre de la base de datos a
            borrar.                                                  número ...
              Identificador_conexión: identificador de la
                                                                     Pues con este número
            conexión.
                                                                     damos por terminado los
                                                                     conceptos básicos de
            <?php
                                                                     PHP, ahora toca aplicar todo lo aprendido para
            mysql_drop_db(“pruebas”, $miconexion);
                                                                     crear aplicaciones Web seguras. En el próximo
            ?>
                                                                     número comenzaremos a explicar como
            La función mysql_drop_db() intenta suprimir una
                                                                     programar aplicaciones seguras utilizando PHP.
            base de datos completa del servidor asociado al
            identificador de enlace.




Página 12                                                                                                          PC PASO A PASO Nº 21
CURSO DE TCP/IP:                                             4ª        ENTREGA
      TCP (TRANSMISION CONTROL PROTOCOL)
                                               2ª     parte

          Este mes nos metemos de lleno en los paquetes de Internet. Crearemos un paquete desde
          cero, nos adentraremos en el código binario y para rematar comprenderemos de una
          vez por todas el significado de algunos ataques ya conocidos por todos.


          1.  Fundamentos                     de      la     esos ceros y unos de los que vamos a hablar
          comunicación digital.                              ahora.

          Cuando empecé con el curso de TCP/IP, cuya         De momento, nos quedaremos con una
          cuarta entrega tenéis ahora mismo en vuestras      simplificación de la idea de qué es exactamente
          manos, ya os advertí de que, cansado de ver        un cero y un uno. Como sabemos, los datos
          una y otra vez las mismas técnicas para            que circulan en una red lo hacen siempre a
          explicar los conceptos en todos los libros y       través de un medio físico. Este medio,
          tutoriales, este curso pretendía ser una           normalmente, será un cable eléctrico, pero
          apuesta arriesgada, orientando la explicación      puede ser también, por ejemplo, una onda de
          de los mismos conceptos desde un punto de          radiofrecuencia, un cable óptico, o cualquier
          vista bastante diferente.                          otro medio físico empleado en la interconexión
                                                             de máquinas. Quedémonos con el caso más
          Siguiendo en esta línea un tanto experimental,     común, el del cable eléctrico, aunque todo lo
          voy a dar otro nuevo paso que no he visto          explicado se puede extrapolar, por supuesto,
          en ningún libro sobre TCP/IP, para tratar de       a cualquier otro medio físico.
          que os familiaricéis más aún con TCP/IP.
                                                             Como es lógico, por un cable eléctrico circula
          Lo que pretendo conseguir ahora es que             electricidad. La electricidad por si misma no
          convirtáis esos misteriosos paquetes TCP que       contiene mucha información. Un medio de
          tenéis rondando ahora mismo por vuestras           transmisión de información será más versátil
          cabezas, en algo tangible, de carne y hueso,       cuantos más parámetros posea.
          o más bien debería decir de unos y ceros.
                                                             Por ejemplo, una imagen puede transmitir
          Para ello, vamos a ver con un ejemplo cómo         una gran cantidad de información (ya se sabe
          está construido exactamente un paquete TCP.        que una imagen vale más que mil palabras),
          Mi intención es que después de este ejemplo,       ya que posee muchísimos parámetros, como
          los paquetes TCP dejen de ser al fin para          son los colores en cada punto, la iluminación,
          vosotros unos entes teóricos de los cuales         etc. En cambio, la electricidad posee pocos
          conocéis el funcionamiento, pero no su             parámetros propios, como pueden ser la
          constitución “física”.                             tensión eléctrica (voltaje), y la intensidad
                                                             eléctrica (corriente). Para colmo, estos dos
          Por supuesto, esta constitución física no          parámetros están directamente relacionados
          podremos terminar de comprenderla hasta            entre sí (¿recordáis la famosa ley de Ohm, o
          que lleguemos a la capa inferior de la jerarquía   vosotros también suspendíais física en el cole?
          de capas de TCP/IP: el nivel físico. Así que
          habrá que esperar aún unos cuantos meses           Por tanto, una primera solución intuitiva para
          antes de que veamos qué son exactamente            transmitir información por medio de la

PC PASO A PASO Nº 21                                                                                           Página 13
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




            electricidad sería hacer variar esos parámetros      Siempre habréis escuchado el término
            en función de lo que quisiéramos transmitir.         analógico como opuesto al término digital.
                                                                 Vamos a ver ahora mismo en qué consisten
            Por ejemplo, si queremos transmitir un               las diferencias entre analógico y digital.
            número, podemos ajustar el voltaje del cable
            en relación directa con el valor de ese número.      Si bien la tecnología analógica aprovecha la
            Por ejemplo, para transmitir un 5 pondríamos         tensión eléctrica, uno de los parámetros que
            5 voltios en el cable, y para transmitir un 7        caracterizan la electricidad que circula por un
            pondríamos 7 voltios en el cable. Si, en             cable, la tecnología digital no utiliza ninguno
            cambio, queremos transmitir el número                de los parámetros de la electricidad para
            250000, más nos vale no tocar el “cablecito”,        transmitir la información.
            a no ser que queramos seguir este curso
            desde el más allá (allí también llega, desde         ¿Cómo puede transmitirse la información
            que la revista cambió de distribuidor).              entonces? Evidentemente, siempre es
                                                                 imprescindible la presencia de una variable
            Supongo que las mentes más despiertas                que se pueda modificar convenientemente
            habrán descubierto ya aquí una de las más            para codificar la información que se desea
            destructivas técnicas de hacking. Si algún día       transmitir. La diferencia es que en el caso de
            os encontráis por un chat al <malnacido> ese         la transmisión digital el parámetro que se
            que os robó la novia, basta con que le enviéis       utiliza para portar la información no es
            un paquete que contenga un número tocho              inherente a la propia electricidad, si no que
            con ganas, como el 176874375618276543,               es un parámetro más sencillo: el tiempo.
            y por su módem circulará tal tensión eléctrica,
            que en el lugar que ocupaba su casa veréis           Evidentemente, el tiempo es siempre un
            un cono atómico que ni el de Hiroshima.              parámetro fundamental en toda comunicación,
                                                                 ya que es imprescindible que haya una
            Bueno, antes de que se me eche alguien               sincronización temporal entre transmisor y
            encima por decir semejantes estupideces,             receptor.
            tendré que reconocer que, como es lógico,
            las cosas no funcionan así en la práctica.           Volviendo al caso de la transmisión analógica,
            ¡Pero no os creáis que sea algo tan                  pensemos por ejemplo en el caso en el que
            descabellado! ¿Y si en lugar de una proporción       se transmitan sólo números del 0 al 9 y, para
            1/1 utilizamos otra clase de proporcionalidad        conseguir representar números más altos lo
            para transmitir los números?                         que se hace es transmitir cada una de sus
                                                                 cifras por separado (unidades, decenas,
            Por ejemplo, supongamos que no queremos              centenas, etc.). Si, por ejemplo, quisiéramos
            superar los 10 voltios y, en cambio, queremos        t ra n s m i t i r e l n ú m e r o 5 2 3 , p r i m e r o
            transmitir números entre 1 y 1000. Pues basta        transmitiríamos 5 voltios, luego 2 voltios, y
            con que establezcamos el convenio de que             por último 3 voltios.
            10 voltios equivalen al número 1000 y, por
            tanto, 5 voltios al 500, 2’5 voltios al 250, etc.,   En la imagen podemos
            etc.                                                 ver la transmisión del
                                                                 número 523 por una
            Esta solución no sólo es mucho más realista,
                                                                 línea analógica. En el eje
            si no que incluso ha sido el sistema de
                                                                 X (el horizontal) se
            transmisión de información en el que se ha
                                                                 representa el tiempo, por
            basado toda la electrónica hasta que llegó la
                                                                 ejemplo, en segundos, y
            revolución digital. Y el nombre de esto os
                                                                 en el eje Y (el vertical)
            sonará mucho, ya que a esto es a lo que se
                                                                 se representa la tensión en voltios.
            llama comunicación ANALÓGICA.

Página 14                                                                                                  PC PASO A PASO Nº 21
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




          Lógicamente, es necesario establecer un           Por tanto, si queremos transmitir digitalmente
          convenio entre el transmisor y el receptor        el número 9, estos serán los voltajes que
          para saber cuánto tiempo tiene que pasar          tendremos que poner en la línea:
          entre la transmisión de cada cifra. Si no fuese
          así, imaginad lo que pasaría si tratásemos de     Es decir, primero 1 voltio
          transmitir el número 5551. Si la línea se         durante un segundo,
          mantiene en 5 voltios el tiempo necesario         luego 0 voltios durante
          para transmitir las tres primeras cifras, ¿cómo   dos segundos y, por
          podrá saber el receptor que en ese tiempo         último, 1 voltio durante
          se han transmitido tres cincos, y no sólo uno,    el último segundo.
          o doce?
                                                            ¿Cómo podemos entonces transmitir un
          Por tanto, ha de existir un convenio previo       número de dos cifras, como por ejemplo el
          entre emisor y receptor que diga “cada            12?
          segundo se transmitirá una nueva cifra”. Por      Pues de nuevo hay que hacer otro convenio
          tanto, si pasado un segundo el voltaje no ha      entre el emisor y el receptor y decir: “cada
          cambiado, significa que la siguiente cifra es     cifra decimal va a constar de 4 cifras binarias”.
          igual a la anterior.                              Por tanto, si transmitimos la secuencia: “0001
                                                            0010” (ver la tabla anterior) estaremos
          Lo que hace la tecnología digital es explotar     transmitiendo el número 12, según el convenio
          al máximo este tipo de “convenios”. Pero          preestablecido, tal y como vemos en la
          empecemos viendo el caso más simple de            siguiente imagen.
          todos, que es igual al caso de la transmisión
          analógica.

          Imaginemos que queremos transmitir números
          pero que sólo puedan ser 0 o 1. En ese caso,
          la cosa funcionaría igual: a cada segundo una     De esta manera, a base de acuerdos entre el
          nueva cifra, y no hay más misterio. La            transmisor y el receptor, podemos transmitir
          diferencia sería que la tensión sólo podría       cualquier información, con sólo transmitir ceros
          tener dos valores: 0 o 1 voltios.                 y unos.
          La diferencia viene cuando queremos
          transmitir números más grandes, que es            ¿Cuál es la ventaja de transmitir sólo dos
          cuando hay que hacer “convenios raros”.           valores en lugar de variar el voltaje en función
                                                            del valor que se desea transmitir? Pues son
          En realidad, estos convenios tienen poco de       varias las ventajas, pero la más obvia es la
          raro, al menos para un matemático, ya que         gran fiabilidad de la transmisión.
          no es ninguna invención, si no simplemente
          una aplicación directa de las matemáticas.        Imaginemos que nuestro cable lo hemos
          Concretamente, lo que se aplica es la             comprado en el Todo a 100 y falla más que
          aritmética binaria.                               una escopeta de feria. Pretendemos transmitir
                                                            5 voltios y, en cambio, unas veces el cable
                                  Este “convenio” asigna    transmite 4 voltios, otras veces 3,5, otras
                                  una     secuencia         veces 2...
                                  diferente       para
                                  representar cada          Estos fallos del cable serían críticos en una
                                  número decimal, que       transmisión analógica, ya que el voltaje se
                                  podemos ver en la         traduce directamente en la información que
                                  tabla de la izquierda.    transmitimos. En cambio, la transmisión digital


PC PASO A PASO Nº 21                                                                                            Página 15
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




            nos permite unos márgenes de error muy
            grandes. Al fin y al cabo, transmitir ceros y           !               ¿Y si el mundo...
            unos se limita tan sólo a diferenciar “no hay
            electricidad en el cable” de “sí hay electricidad
                                                                   ¿Y si el mundo fuese distinto?
            en el cable”.                                       1. Muchas personas, cuando les dices que el mundo informático
            Por tanto, podemos decir por ejemplo: “si              funciona con CEROS y UNOS, nunca llegan a entenderlo. Con
            hay menos de un voltio en el cable,                    lo sencillo que sería trabajar con el sistema decimal
            consideramos que es un cero. Si hay más de             (0,1,2,3,4,5,6,7,8,9) e incluso con letras.
            un voltio, consideramos que es un uno”. Así,
            todos esos fallos del cable de Todo a 100 no           Acabamos de descubrir que aplicar el sistema decimal supondría
            afectarían a la transmisión digital, ya que            10 niveles de voltaje en un cable eléctrico, algo técnicamente
            incluso 2 voltios seguiría siendo considerado          posible pero MUY CARO. Como ya hemos dicho los cables
            como “sí hay electricidad en el cable” y, por          deberían ser muy buenos y los dispositivos que detectasen los
            tanto, sería considerado como un 1.                    cambios de voltaje deberían ser muy precisos. Pero esto es
                                                                   hablando del mundo analógico… si nos vamos al digital la cosa
            Son muchas otras las ventajas de lo digital            se pone interesante.
            frente a lo analógico, como la mayor facilidad
            a la hora de almacenar y procesar la                   Hemos dicho que en el MUNDO DIGITAL solo hay dos estados,
            información, pero esas ventajas no se deducen          es decir, "unos" (abierto, con electricidad, iluminado) y ceros
            de lo explicado hasta ahora, por lo que no             (cerrado, sin electricidad, apagado). Pero ¿por qué? ¿por qué el
            entraremos ahora en más detalle. De                    hombre ha decidido que el mundo digital solo tenga dos estados
            momento, la idea con la que nos tenemos                en lugar de 10?
            que quedar es con que a la hora de transmitir
            información, la transmisión digital tiene una          Muy sencillo, POR DINERO!!! ¿Cómo? ¿qué?... … En el diminuto
            mayor inmunidad al ruido y, en general, a              universo que conocemos, nuestro planeta, es muy sencillo (y
            cualquier error, que la transmisión analógica.         barato) encontrar sustancias que sean capaces de tener dos estados
                                                                   claramente diferenciados, que puedan ser capaces de pasar de un
            Por supuesto, nada de lo explicado hasta               estado a otro muy rápidamente, que lo hagan de forma barata y
            ahora es en la práctica tal y como lo he               para colmo que sea muy fácil detectar esos estados.
            contado (para aquellos que sepan de qué va
            el tema y estén flipando), pero mi intención           Al igual que una bombilla puede estar encendida o apagada y
            no es escribir un RFC sobre transmisión                todos podemos percibirlo mirándola (luz/oscuridad) o tocándola
            analógica vs. transmisión digital, si no tan           (calor/frío), en el caso de la informática EL DIOS ES EL SILICIO.
            sólo explicar conceptos, aunque tenga que              Simplificando mucho el tema, podemos decir el silicio deja pasar
            ser faltando a la realidad en muchas                   la electricidad o no (ceros y unos), lo hace rapidísimamente (todos
            ocasiones. Lo importante es que comprendáis            queremos tener un PC ultrarrápido) y detectar el estado ("cargado"
            los conceptos que subyacen a una transmisión           o "descargado") es tecnológicamente sencillo y por lo tanto barato.
            de datos digitales, como es el caso de TCP/IP.
                                                                   ¿Y si el mundo fuese distinto?
            Para los más quisquillosos que sigan                   Imagina otro elemento, por ejemplo el agua. Todos conocemos
            insistiendo en que las cosas no son así, y que         tres de sus estados, el sólido, el líquido y el gaseoso… si el agua
            realmente incluso las transmisiones digitales          se pareciese al silicio (si fuese sencillo pasar de un estado a otro,
            circulan de forma analógica, insisto en que            lo hiciese a la velocidad del rayo y fuese sencillo detectar esos
            no estoy tratando de explicar el nivel físico          cambios de estado)… nuestro ordenador estaría basado en un
            (cosa que ya haré dentro de unos cuantos               procesador de agua y, en ese caso… sería MUCHO más potente
            artículos, y donde todo esto quedará                   y rápido que los que ahora tenemos basados en silicio.
            finalmente aclarado), si no tan sólo
            abstraerme de los detalles para explicar los           ¿Qué? ¿Cómo? Sí, porque tendríamos un sistema de TRES
                                                                   estados (apagado -hielo-, neutro -líquido- y encendido -gaseoso-)
            conceptos básicos.

Página 16                                                                                                   PC PASO A PASO Nº 21
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




                                                                         los ordenadores personales, llamamos byte.
 en lugar de DOS estados (apagado/encendido). Eso significa que          Un byte es simplemente una palabra de 8 bits,
 en lugar del código BINARIO utilizaríamos el código TRINÁRIO            es decir, de 8 cifras binarias (cero o uno). Si
 (el nombre me lo acabo de inventar). Al haber tres estados en           quisiéramos representar los números decimales
 lugar de dos podríamos crear convenios mucho más optimizados,           con un byte, ésta podría ser la tabla
 es decir, transmitir información de forma mucho más optimizada          correspondiente:
 y por lo tanto mucho más rápida.

 Deja volar tu imaginación… si un buen día alguien encuentra (o
 fabrica, o trae de otra galaxia) un material parecido al silicio pero
 que pudiese tener 600 estados en lugar de dos… bufff… el mundo
 informático daría un salto astronómico en velocidad de cálculo.
 Para la humanidad sería comparable al paso de la edad de Piedra
 a la edad de Hierro.

 Actualmente, a falta de materiales nuevos los científicos intentan
 utilizar elementos conocidos pero difíciles de "controlar". Unos
 basados en dos estados y otros en multiestados… por ejemplo
 los átomos.
                                                                         Vamos al fin a ver algo directamente
 Al final, la orgullosa humanidad depende de los materiales que          relacionado con TCP. Volvamos al último artículo
 su "humilde" entorno proporciona.                                       de la revista, y repasemos la cabecera TCP.
                                                                         Por si no lo tenéis a mano, aquí os la vuelvo
                                                                         a mostrar.
              2.- Codificación binaria.

              Llegados a este punto, posiblemente ya
              habréis perdido un poco de miedo a eso de
              los ceros y los unos. Lo que nos queda por
              ver es cómo se codifica realmente la
              información en binario (utilizando tan sólo
              ceros y unos), es decir, cuáles son los
              “convenios” reales de los que hemos hablado,
              que permiten que un transmisor y un receptor
              se puedan entender.

              Es aquí donde entra el concepto fundamental
              de palabra (word). La forma en que se                      Como vemos, en la cabecera TCP se manejan
              representa la información depende del tamaño               distintos tamaños de palabra. En primer lugar,
              de la palabra utilizada. En el ejemplo anterior,           para los campos puerto origen y puerto
              donde representábamos cada número decimal                  destino contamos con 16 bits, después, para
              con 4 cifras binarias, es decir, con 4 bits (bit           los números de secuencia y de
              es simplemente el nombre dado a una cifra                  confirmación tenemos 32 bits, 4 bits para
              binaria, es decir, un número que sólo puede                el campo comienzo de datos, 1 bit para cada
              ser un cero o un uno), teníamos una palabra                uno de los flags, etc.
              de 4 bits para representar los números
              decimales.                                                 Para saber cuántos valores se pueden
                                                                         representar con cada tamaño de palabra, basta
              La palabra más comúnmente utilizada en                     con hacer la potencia de 2 con el tamaño
              informática es el octeto que, en el caso de                de la palabra en bits. Es decir, con una


PC PASO A PASO Nº 21                                                                                                        Página 17
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)



                                                    4
            palabra de 4 bits podemos representar 2 =        2.1. P a s a n d o d e b i n a r i o a
            16 valores diferentes, con una palabra de 8
                  8                               16         decimal
            bits 2 = 256 valores, con 16 bits 2       =
            65536, etc.
                                                             Vamos a ver en primer lugar cómo traducir
                                                             una secuencia de ceros y unos en algo
            Ahora podéis comprender por qué todo lo
                                                             comprensible para nuestras mentes decimales.
            relacionado con la tecnología digital sigue
            siempre estos números. La memoria RAM que
                                                             En la base decimal, que es la que nosotros
            compras para el PC, las tarjetas de memoria
                                                             utilizamos, llamamos a cada cifra de una
            para la cámara digital, la velocidad del ADSL,
                                                             manera diferente según el orden que ocupa:
            siempre son los mismos números; 8, 16, 32,
                                                             unidades, decenas, centenas, etc. Como nos
            64, 128, 256, 512, 1024, 2048... Todos esos
                                                             explicaron en los primeros años del cole, para
            números son las diferentes potencias de 2.
                                                             calcular un número a partir de su
                                                             representación decimal, tenemos que sumar
            El caso más sencillo es el de 1 único bit,
                             1                               las unidades a las decenas multiplicadas por
            donde tenemos 2 = 2, es decir, se pueden
                                                             diez, las centenas multiplicadas por 100, etc.,
            representar sólo 2 valores con 1 bit. Estos 2
                                                             etc. Es decir: 534 = 5 * 100 + 3 * 10 + 4 * 1.
            valores son, por supuesto: cero, y uno.
                                                                                                        2
                                                             En realidad, 100 es una potencia de 10 (10
            En el caso, por ejemplo, de 3 bits, tenemos
             3                                               = 100). Y por supuesto 10 también es una
            2 = 8 valores diferentes, que son todas las                         1
                                                             potencia de 10 (10 = 10). pero también el
            posibles combinaciones de 3 cifras, donde
                                                             1 lo es, ya que 1 es potencia de cualquier
            cada cifra puede ser un uno o un cero, tal y                    0
                                                             número, pues X = 1, donde en este caso, es
            como vemos en la tabla.
                                                             X = 10, es decir, 10 elevado a cero es uno.

                                        Como vemos, no
                                                             Por tanto, el número 534 se puede representar
                                        quedan más                                 2         1          0
                                                             como: 534 = 5*10 + 3*10 + 4*10 .
                                        p o s i b l e s
                                        combinaciones de
                                                             Esta regla se puede aplicar a cualquier otra
                                        ceros y unos con
                                                             base que no sea 10. Volvamos a la tabla
                                        sólo 3 cifras, y
                                                             anterior, y veremos que el número 7 se
                                        esto nos permite
                                                             representa como 111 en base 2.
                                        representar tan
                                        sólo los números     Si aplicamos la fórmula anterior, pero en este
                                        del 0 al 7.          caso utilizando base 2, tendremos:
                                                                    2       1       0
                                                             1 * 2 + 1*2 + 1*2 = 7. En efecto, se
            Como ya dije antes, para un matemático estos                        2       1           0
                                                             cumple, ya que 2 = 4, 2 = 2, y 2 = 1,
            convenios para representar los números           luego: 1*4 + 1*2 + 1*1 = 7.
            decimales mediante cifras binarias no son
            ningún misterio, ya que basta con aplicar las    Con esta sencilla fórmula de las potencias de
            bases de la aritmética modular.                  2 se puede convertir cualquier número binario
                                                             a su equivalente en decimal. Por ejemplo,
            Voy a tratar de explicar rápidamente en qué      vamos a traducir a decimal el número
            consisten estas fórmulas porque, aunque al       10011010.
            principio os puedan parecer complicadas, en                                               7
                                                             Empezamos aplicando la fórmula: 1*2 +
            realidad son realmente sencillas y, como todo,       6       5      4        3      2        1
                                                             0*2 + 0*2 + 1*2 + 1*2 + 0*2 + 1*2
            es sólo cuestión de práctica el aplicarlas de          0
                                                             + 0*2 . Ahora, sabiendo los valores de cada
            forma natural.
                                                             potencia de dos (cualquier geek que se precie
                                                             tiene que conocer como mínimo todas las

Página 18                                                                                       PC PASO A PASO Nº 21
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




              potencias de 2 con exponentes de 0 a 16),                 Pero nosotros no nos conformamos con hacer
              podemos traducir esa fórmula en: 1*128 +                  las cosas, si no que nuestro auténtico interés
              0*64 + 0*32 + 1*16 + 1*8 + 0*4 + 1*2 +                    es el saber cómo se hacen. Así que os explico
              0*1. Es decir, nos queda la siguiente suma:               rápidamente un algoritmo para convertir
              128 + 16 + 8 + 2 = 154. Por tanto, el número              cualquier número decimal a binario.
              binario 10011010 representa al número 154
              en decimal.                                               Usemos para el ejemplo el número 137.

              Por si queréis practicar, os dejo como ejercicio          El proceso a seguir será ir dividiendo el
              algunos números más, con su traducción,                   número (en este caso 137) por 2 y, en cada
              para que lo comprobéis vosotros mismos:                   división, quedarnos con el resto de la división
                                                                        (que sólo podrá ser cero o uno). Ahora te
              10110101 = 181
                                                                        quedará claro.
              00111100 = 60
              111010001010101010100101 = 15248037
                                                                                        El resultado de la primera
                                                                                        división (llamado cociente, en
              2.2. Pasando de decimal a
                                                                                        verde) es 68, y el resto (en
              binario.
                                                                                        rojo) es 1. Este 1 será el bit
              Aquí la cosa ya se pone más chunga. Aun así,              menos significativo, es decir, la cifra binaria
              juraría que esto ya lo expliqué en alguno de              que está a la derecha del todo.
              mis artículos.
                                                                        Continuamos el proceso con el nuevo cociente
              Hay varios trucos para convertir de decimal               que hemos obtenido:
              a binario. El más sencillo, por supuesto, es
              meter el número en la calculadora de windows,                               Ahora hemos obtenido un 0,
              y luego pinchar en donde pone BIN para que                                  que será la siguiente cifra
              lo   pase      automáticamente,               jeje.                         binaria. Continuamos el proceso
                                                                                          con el nuevo cociente, 34:

                                                                        3 4 / 2       = 1 7 , con re st o 0.
                                                                        17 / 2       = 8, con resto 1.
                                                                        8 / 2 =       4, con resto 0.
                                                                        4 / 2 =      2, con resto 0.
                                                                        2 / 2 = 1,   con resto 0.

                                                                        Esta última operación (en azul) es fundamental,
                                                                        ya que el bit más significativo, es decir, el que
                                                                        hay más a la izquierda, será el último cociente,
                                                                        es decir 2/2 = 1.

                                                                        Por tanto, el número 137 en binario nos
                                                                        quedará: 1 0 0 0 1 0 0 1.

  !                Para que...
                                                                            !              Si tienes...
  Para que a nadie se le ocurra enviar un mail diciendo que la
  calculadora de Windows no puede hacer eso, venga, lo explicamos           Si tienes interés en avanzar por tu cuanta en cálculo binario, hay
  muy rápido. Abre la calculadora, Menu Ver y pulsa sobre Científica.       miles de páginas en Internet que te lo explican perfectamente y
  Ya está                                                                   por supuesto de forma gratuita. Busca en www.google.com y
  Ahora introduce cualquier número y pulsa sobre Bin                        avanza tanto como quieras

PC PASO A PASO Nº 21                                                                                                              Página 19
Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II)




            Construyendo un paquete TCP                     El problema es que no hemos ajustado cada
            desde cero.                                     campo a su tamaño de palabra. El tamaño
                                                            de palabra de cada uno de estos dos campos
            Ya podemos ponernos manos a la obra con el      es de 16 bits, por lo que cada uno de los dos
            tema que nos ocupa, que son los paquetes        números obtenidos tiene que ser representado
            TCP. Vamos a recordar la cabecera TCP (volved   con 16 cifras binarias. Para ello, habrá que
            atrás un poco para ver la imagen), y a ir       poner el suficiente número de ceros a la
            campo por campo construyendo el paquete.        izquierda, para rellenar las 16 cifras. Así, nos
                                                            quedará:
            Vamos a poner como ejemplo, el primer
                                                            1345 = 0000010101000001
            paquete que se envía cuando queremos
                                                            21     = 0000000000010101
            establecer una conexión con un servidor de
            FTP.
                                                            Ahora ya si que podemos concatenar ambos
            En primer lugar, tenemos que conocer los        para conseguir la primera fila de la cabecera:
            puertos de origen y de destino (los dos
            primeros campos de la cabecera TCP). El         00000101010000010000000000010101
            puerto de destino será el 21, que es el
            asignado por el estándar al servicio de FTP     Como experimento, probad a convertir este
            (aunque bien sabréis muchos de vosotros que     número en su equivalente decimal. El resultado
            no siempre se usa este puerto, como en el       es 88145941. ¿Y qué nos dice este número?
            caso de los dumps, donde se suelen usar otros   Pues absolutamente nada, ya que lo importante
            puertos menos “sospechosos”).                   a la hora de traducir un número de una base
            El puerto de origen será un puerto aleatorio    a otra no es sólo la secuencia de cifras, si no
            asignado por el sistema operativo a la hora     también el cómo se agrupen estas. Si
            de abrir el socket, es decir, la estructura     agrupamos esta secuencia en grupos de 16,
            utilizada por el sistema para establecer la     entonces si que tendrá un sentido, pero si la
            nueva conexión TCP/IP. Supongamos que el        agrupamos en una única secuencia de 32 bits,
            sistema nos ha asignado el puerto 1345 como     el número resultante no tiene ningún interés
            puerto de origen.                               para nosotros. Por tanto, es absolutamente
                                                            imprescindible conocer el tamaño de las
            Ya tenemos los datos necesarios para rellenar   palabras.
            la primera fila de la cabecera TCP.
            En primer lugar, tenemos que convertir el       Vamos ahora con la segunda fila de la cabecera.
            número 1345 en su equivalente binario, y lo     Como vemos, ahora nos toca el campo
            mismo con el número 21.                         número de secuencia. Este número también
                                                            será asignado por el sistema operativo
            Aplicando el algoritmo explicado en el punto
                                                            (recordemos del artículo anterior que no
            anterior, obtenemos:
                                                            conviene que sea 0 cada vez que se establece
            1345 = 10101000001
                                                            una nueva conexión). En nuestro ejemplo el
            21 = 10101
                                                            sistema nos asignará el número 21423994.
            Para construir la primera fila de la cabecera   Lo convertimos a binario, y nos da el número:
            TCP tenemos que concatenar el puerto origen     1010001101110011101111010.
            con el puerto destino, por lo que quedaría:
            10101000001 10101.                              Este número es de 25 bits, por lo que habrá
                                                            que poner 7 ceros a su izquierda, para
            Tenemos, por tanto, que nuestra primera fila
                                                            completar los 32 bits de la palabra que
            consta de 16 bits... pero... no puede ser, si
                                                            corresponde a este campo. Por tanto, la
            habíamos quedado en que cada fila de la
                                                            segunda fila de nuestra cabecera TCP será:
            cabecera TCP eran 32 bits.
                                                            00000001010001101110011101111010

Página 20                                                                                       PC PASO A PASO Nº 21
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos
Aprende PHP y Bases de Datos

Más contenido relacionado

Destacado

Calle tomada - Intervención urbana - Argentina
Calle tomada  - Intervención urbana - ArgentinaCalle tomada  - Intervención urbana - Argentina
Calle tomada - Intervención urbana - ArgentinaSilvia M K
 
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...Flavia Rubino
 
Presentación[tesis] 21.10.2011
Presentación[tesis] 21.10.2011Presentación[tesis] 21.10.2011
Presentación[tesis] 21.10.2011Manuel Villalta
 
Webtech 2010: twitter programming
Webtech 2010: twitter programmingWebtech 2010: twitter programming
Webtech 2010: twitter programmingMatteo Baccan
 
Recepción educa tv
Recepción educa tvRecepción educa tv
Recepción educa tvAbel Suing
 
Venezia 2010 Facebook Developer Garage Parte 2
Venezia 2010 Facebook Developer Garage Parte 2Venezia 2010 Facebook Developer Garage Parte 2
Venezia 2010 Facebook Developer Garage Parte 2Roberto Marmo
 
Storybusters: l'intervista narrativa
Storybusters: l'intervista narrativaStorybusters: l'intervista narrativa
Storybusters: l'intervista narrativaRaffaele Boiano
 
Quién fue Terry Schiavo?
Quién fue Terry Schiavo?Quién fue Terry Schiavo?
Quién fue Terry Schiavo?Alonso Custodio
 

Destacado (20)

Fulltext
FulltextFulltext
Fulltext
 
Ajax
AjaxAjax
Ajax
 
Calle tomada - Intervención urbana - Argentina
Calle tomada  - Intervención urbana - ArgentinaCalle tomada  - Intervención urbana - Argentina
Calle tomada - Intervención urbana - Argentina
 
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...
incontro bloggers 19_3_09 il marketing della conversazione e proposte per nuo...
 
Presentación[tesis] 21.10.2011
Presentación[tesis] 21.10.2011Presentación[tesis] 21.10.2011
Presentación[tesis] 21.10.2011
 
Webtech 2010: twitter programming
Webtech 2010: twitter programmingWebtech 2010: twitter programming
Webtech 2010: twitter programming
 
Recepción educa tv
Recepción educa tvRecepción educa tv
Recepción educa tv
 
Venezia 2010 Facebook Developer Garage Parte 2
Venezia 2010 Facebook Developer Garage Parte 2Venezia 2010 Facebook Developer Garage Parte 2
Venezia 2010 Facebook Developer Garage Parte 2
 
Php y mysql
Php y mysqlPhp y mysql
Php y mysql
 
Apostila php
Apostila phpApostila php
Apostila php
 
Introducción a PHP5
Introducción a PHP5Introducción a PHP5
Introducción a PHP5
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Storybusters: l'intervista narrativa
Storybusters: l'intervista narrativaStorybusters: l'intervista narrativa
Storybusters: l'intervista narrativa
 
Periodismo digital
Periodismo digitalPeriodismo digital
Periodismo digital
 
El modelo 1 a 1
El modelo 1 a 1El modelo 1 a 1
El modelo 1 a 1
 
Indic qualit educ_infantil
Indic qualit educ_infantilIndic qualit educ_infantil
Indic qualit educ_infantil
 
Quién fue Terry Schiavo?
Quién fue Terry Schiavo?Quién fue Terry Schiavo?
Quién fue Terry Schiavo?
 
La violencia contra_la_infancia
La violencia contra_la_infanciaLa violencia contra_la_infancia
La violencia contra_la_infancia
 
Tienes 5 segundos
Tienes 5 segundosTienes 5 segundos
Tienes 5 segundos
 
Eldigitaltenseseña
EldigitaltenseseñaEldigitaltenseseña
Eldigitaltenseseña
 

Similar a Aprende PHP y Bases de Datos (20)

Hxc13
Hxc13Hxc13
Hxc13
 
Hxc23
Hxc23Hxc23
Hxc23
 
Hxc14
Hxc14Hxc14
Hxc14
 
Hxc9
Hxc9Hxc9
Hxc9
 
Hxc12
Hxc12Hxc12
Hxc12
 
Hxc22
Hxc22Hxc22
Hxc22
 
Hxc10
Hxc10Hxc10
Hxc10
 
Hxc11
Hxc11Hxc11
Hxc11
 
Hxc3
Hxc3Hxc3
Hxc3
 
Hxc8
Hxc8Hxc8
Hxc8
 
Hx c26
Hx c26Hx c26
Hx c26
 
Hx c18
Hx c18Hx c18
Hx c18
 
Hx c17
Hx c17Hx c17
Hx c17
 
Haxcra8.pdf
Haxcra8.pdfHaxcra8.pdf
Haxcra8.pdf
 
Hxc2
Hxc2Hxc2
Hxc2
 
Hx c19
Hx c19Hx c19
Hx c19
 
Hxc7
Hxc7Hxc7
Hxc7
 
Diccionario informatico luz marina
Diccionario informatico luz marinaDiccionario informatico luz marina
Diccionario informatico luz marina
 
Hx c27
Hx c27Hx c27
Hx c27
 
Taller Evaluacion
Taller  EvaluacionTaller  Evaluacion
Taller Evaluacion
 

Más de rubenroa

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicosrubenroa
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltarubenroa
 
Causalidad
CausalidadCausalidad
Causalidadrubenroa
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasrubenroa
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia rubenroa
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1rubenroa
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011rubenroa
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011rubenroa
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)rubenroa
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1arubenroa
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentosrubenroa
 
tabaquismo
tabaquismotabaquismo
tabaquismorubenroa
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_rubenroa
 
Auditoria em
Auditoria emAuditoria em
Auditoria emrubenroa
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazorubenroa
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazorubenroa
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmasrubenroa
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acvrubenroa
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomiarubenroa
 

Más de rubenroa (20)

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicos
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante delta
 
Causalidad
CausalidadCausalidad
Causalidad
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitarias
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)
 
Ferinject
FerinjectFerinject
Ferinject
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentos
 
tabaquismo
tabaquismotabaquismo
tabaquismo
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_
 
Auditoria em
Auditoria emAuditoria em
Auditoria em
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazo
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazo
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmas
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acv
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomia
 

Último

Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 

Último (20)

Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 

Aprende PHP y Bases de Datos

  • 1. HACK X CRACK: TCP --> COMPRENDIENDO LOS ATAQUES DE INTERNET P P A A SISTEMA DE DETECCION DE INTRUSOS !!! S S O O P A S Oa P A a a a a a a aa a a a a a 3 SERVIDORES ON LINE PARA TUS PRACTICAS DE HACK NÚME RO 21 * ACCEDIENDO A BASES DE DATOS * SISTEMAS ODBC Y API * INSTRUCCIONES SQL * BASES DE DATOS: RELACIONALES ORIENTADA A OBJETOS EXTENDIDAS Nº 21 -- P.V.P. 4,5 EUROS 00021 8 414090 202756 LOS MEJORES ARTÍCULOS GRATIS EN NUESTRA WEB P C PA S O A PA S O : P R O G R A M A C I O N W E B C O N B A S E S D E D AT O S
  • 2.
  • 3. P A S O aa P A S Oaa aa a a aa a a a a a a aa Director de la Publicación EDITORIAL: EDITOTRANS S.L. J. Sentís C.I.F: B43675701 PERE MARTELL Nº 20, 2º - 1ª E-mail contacto 43001 TARRAGONA (ESPAÑA) director@hackxcrack.com Director Editorial I. SENTIS Diseño gráfico: E-mail contacto J. M. Velasco director@editotrans.com Título de la publicación Los Cuadernos de HACK X CRACK. E-mail contacto: Nombre Comercial de la publicacíón grafico@hackxcrack.com PC PASO A PASO Web: www.hackxcrack.com Dirección: PERE MARTELL Nº 20, 2º - 1ª. Redactores 43001 TARRAGONA (ESPAÑA) AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO, ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE, ZORTEMIUS, AK22, DORKAN, KMORK, MAILA, TITINA, SIMPSIM... ... ... ... ... ¿Quieres insertar publicidad en PC PASO A Contacto redactores PASO? Tenemos la mejor relación precio-difusión del mercado editorial en España. Contacta con redactores@hackxcrack.com nosotros!!! Colaboradores Sr. Ruben Sentis Mas de 130 personas: de España, de Brasil, de Tfno. directo: 652 495 607 Argentina, de Francia, de Alemania, de Japón y Tfno. oficina: 877 023 356 E-mail: miguel@editotrans.com algún Estadounidense. E-mail contacto colaboradores@hackxcrack.com Imprime I.G. PRINTONE S.A. Tel 91 808 50 15 4 CURSO DE PHP: A cceso a bases de dat os 13 CURSO DE T CP/IP: DISTRIBUCIÓN: T CP ( TRANSMISION C ONTR OL PR O T OC OL. II) SGEL, Avda. Valdeparra 29 (Pol. Ind.) 28018 ALCOBENDAS (MADRID) 35 CURSO DE SEGURIDAD EN REDES: IDS (III) Tel 91 657 69 00 FAX 91 657 69 28 62 XB OX (VII): Cr ea tu Sla y er WEB: www.sgel.es TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80 Petición de Números atrasados y Suscripciones (Srta. Genoveva) HORARIO DE ATENCIÓN: DE 9:30 A 13:30 (LUNES A VIERNES) © Copyright Editotrans S.L. NUMERO 21 -- PRINTED IN SPAIN PERIOCIDAD MENSUAL Deposito legal: B.26805-2002 Código EAN: 8414090202756 PID E LO S NUMEROS ATRA SADO S EN - - > WWW.HACKXCRA C K .C OM
  • 4. TRABAJANDO CON BASES DE DATOS EN PHP En este número vamos a manejar la base de datos MySQL en PHP. Conocer como se programan aplicaciones utilizando Bases de Datos es muy importante, ya que nos permitirá, por ejemplo, buscar vulnerabilidades en una Web. Pero todo a su tiempo, primero hay que aprender como va esto de las bases de datos en PHP. Aplicaciones Web. páginas dinámicas PHP que se hayan interpretado anteriormente. Uno de los aspectos más importantes de cualquier lenguaje de programación es el acceso a Bases de La Base de Datos, como ya hemos mencionado, Datos (BBDD). Si unimos la utilidad y la potencia es donde se encuentra la información. Hay muchos de las Bases de Datos a la programación de páginas tipos de Base de Datos y, para el que no tiene ni PHP, podemos programar cualquier aplicación que idea, haremos un paralelismo con los Sistemas nos podamos imaginar. Operativos que nos servirá para entender el siguiente punto. La mayoría de los Websites que existen en Internet, Un Sistema Operativo (por ejemplo Windows) puede obtienen la información que muestran en sus mostrarnos el contenido del Disco Duro. En LINUX páginas accediendo a la información existente en exactamente igual, es un Sistema Operativo que una base de datos. es capaz de mostrarnos el contenido del Disco Duro. PERO OJO!!! Aunque con ambos Sistemas Operativos Un claro ejemplo de esto son los portales de noticias. obtenemos lo mismo (acceso al contenido del disco En ellos, la información publicada se obtiene a duro), la forma en que trabajan internamente es través de consultas a la Base de Datos (donde se MUY DISTINTA, por lo tanto, el programa que se encuentran las noticias). Pero también existen encarga de acceder y visualizar el contenido del Websites en Internet que insertan, modifican e disco duro en Windows es totalmente distinto al de incluso eliminan datos de una Base de Datos, como Linux. por ejemplo una librería on-line, en ella se insertan datos de los clientes, se actualiza el stock de los En las Bases de Datos es exactamente igual. Hay pedidos realizados… Bases de Datos de muchos fabricantes distintos (Oracle, SQL, R3…), nosotros podemos tener Arquitectura Web - BBDD nuestros datos en Oracle, en SQL o en R3, pero En una Aplicación Web que accede a una base de para acceder a ellos necesitaremos instrucciones datos necesitamos los siguientes elementos: distintas. El navegador del cliente. El servidor de páginas HTML y PHP La Base de Datos necesita tener un canal de El protocolo HTTP que se encarga de comunicar comunicación con el Servidor Web encargado de al navegador y al Servidor Web. procesar las páginas. Esta comunicación se puede La Base de Datos, donde se encuentra la realizar de dos formas diferentes: información que se maneja en la aplicación. ODBC (Open Database Connectivity): permite Canal de Comunicación: Los mecanismos (ODBC, que una Aplicación Web se conecte a cualquier API de BBDD) necesarios para comunicar al servidor base de datos que soporte ODBC. Si la base de web con la base de datos… … no te asuste tanta datos cambia, no hay que cambiar la programación, sigla que ahora lo veremos con detalle. ya que la forma de acceder a la información por ODBC es la misma para cualquier motor de Base El usuario utiliza el navegador o browser tanto de Datos que soporte ODBC. Como ya vimos antes, para enviar como para recibir las páginas Web. El si Oracle, SQL y R3 soportasen ODBC, las usuario envía las páginas al Servidor Web y recibe instrucciones de acceso a los datos serían las mismas las páginas del Servidor Web a través del protocolo. (y todos contentos). API (Application Programming Interface): El Servidor Web se encarga atender las peticiones conjunto de funciones que forman parte de la del usuario (solicitud de páginas), procesarlas y interfaz de acceso a una Base de Datos. Si la devolverle el resultado. Este Servidor Web será base de datos cambia, hay que cambiar la capaz de servir tanto páginas estáticas HTML como Página 4 PC PASO A PASO Nº 21
  • 5. Programación PHP - Programación PHP - Programación PHP - Programación PHP programación, ya que la API que accede a otra En el presente curso trabajaremos con la base de base de datos será diferente. Por ejemplo, las API datos MySQL por su integridad con PHP. PHP permite de MySQL y Oracle son totalmente diferentes. trabajar con las bases de datos más utilizadas, ya sea utilizando su propia librería de funciones (API) En muchos casos también es posible utilizar ambas o realizando la conexión mediante un enlace ODBC. formas de acceso a una base de datos, éste es el El soporte de base de datos en PHP incluye algunas caso de MySQL. Si tenemos los drivers necesarios como Oracle, MySQL, PostgreSQL, Sybase, ... para acceder a MySQL a través de ODBC, podemos utilizar el conjunto de funciones ODBC que incluye Instrucciones SQL PHP. Pero también es posible acceder a esta base El lenguaje SQL (Structured Query Language) es de datos a través de su propia API. el lenguaje estándar que se utiliza para manipular la información que contienen las bases de datos Si accedemos a la base de datos a través de la relacionales. API, la rapidez de acceso será mucho mayor que No vamos a entrar en profundidad en el lenguaje si accedemos a ella a través de ODBC, ya que ODBC SQL, ya que esto nos llevaría un tiempo considerable. deberá transformar las instrucciones generadas por Pero si que vamos a contemplar los conceptos PHP a otras que entienda MySQL, haciendo por lo básicos necesarios para realizar una Aplicación Web. tanto más lento el proceso. Bases de Datos Seleccionar Las Bases de Datos (sean del “fabricante” que sean) pueden ser: Para seleccionar registros en una base de datos Bases de Datos Relacionales (RDBMS, Relation utilizaremos la instrucción SELECT. Veremos el Database Management Systems): son las más funcionamiento de la instrucción SELECT a lo largo utilizadas. Los datos se almacenan en diferentes de los siguientes ejemplos. tablas, que a su vez están compuestas por registros (filas), columnas y campos. Existen una gran Los ejemplos que se van a mostrar van a actuar variedad de BBDD relacionales en el mercado: sobre las siguientes tablas: Access, SQL Server, Oracle, ... Bases de Datos Orientadas a Objetos (ODBMS, Object Oriented DBMS): el dato es representado como un objeto con sus correspondientes propiedades y métodos. Algunas de estas bases de datos son ObjectStore, Versant, GemStone, ... Bases de Datos Extendidas (ORDBMS, Object Relational DBMS): reúne las características de los dos tipos de bases de datos anteriores. Un ejemplo de este tipo de bases de datos es PostgreSQL. De entre todas las bases de datos que existen en el mercado MySQL forma la pareja perfecta con PHP. Existen versiones de MySQL tanto para Linux / Unix como para Windows, por lo tanto PHP-MySQL se puede utilizar sobre cualquier plataforma. //Selecciona todos los campos de la tabla alumnos MySQL es una base de datos ideal para aplicaciones SELECT * FROM ALUMNOS; de tamaño pequeño o medio. Su funcionamiento se basa en ejecutar primero un programa residente. Su Y el resultado obtenido es: manejo es a través de la línea de comandos y soporta el lenguaje SQL y conexiones a través de ODBC nivel 0-2. MySQL almacena cada una de las tablas de la base de datos en un fichero separado. El tamaño máximo de estos ficheros es de 4Gb y la limitación impuesta //Selecciona el nombre y el apellido de la tabla alumnos por el sistema operativo y la capacidad de nuestro disco duro. SELECT NOMBRE, APELLIDO FROM ALUMNOS; PC PASO A PASO Nº 21 Página 5
  • 6. Programación PHP - Programación PHP - Programación PHP - Programación PHP Para ordenar los resultados obtenidos añadiremos Donde NOMBRE y APELLIDO son al final de la consulta la opción ORDER BY y a campos de la tabla y van separados continuación los campos por los que queramos por comas (,) ordenar y el sentido de la ordenación ASC Y el resultado obtenido es (ascendente) y DESC (descendiente). //Selecciona todos los capos de la tabla alumnos //Selecciona el nombre y el apellido de la tabla alumnos //cuyo curso sea el C1 y los ordena por su edad //cuyo país sea España SELECT * FROM ALUMNOS SELECT NOMBRE, APELLIDO, PAIS WHERE CURSO = ‘C1’ ORDER BY EDAD ASC; FROM ALUMNOS WHERE PAIS = ‘España’; Y el resultado obtenido es: Donde NOMBRE, APELLIDO y PAIS son campos de la tabla y la opción WHERE filtra por los criterios deseados, en este caso cuyo PAIS de procedencia sea España. Cuando comparemos con una cadena, ésta debe ir rodeada de comillas simples (‘). Utilizando la opción LIKE en vez del operador = Y el resultado podremos comparar parte de una cadena. obtenido es: //Selecciona todos los capos de la tabla alumnos Podemos añadir los operadores lógicos AND y OR //cuyo nombre contenga la letra “a” a la opción WHERE y de esta forma obtendremos SELECT * FROM ALUMNOS filtros con diferentes condiciones. WHERE NOMBRE LIKE ‘%a%’; //Selecciona todos los capos de la tabla alumnos //Selecciona todos los capos de la tabla alumnos //que tengan menos de 30 años y cuyo país sea España //cuyo nombre empiece la cadena “Da” SELECT * FROM ALUMNOS SELECT * FROM ALUMNOS WHERE EDAD < 30 AND PAIS = ‘España’; WHERE NOMBRE LIKE ‘Da%’; Y el resultado obtenido es: //Selecciona todos los capos de la tabla alumnos //cuyo nombre termine con la letra “a” SELECT * FROM ALUMNOS WHERE NOMBRE LIKE ‘%a’; Ahora vamos a relacionar la tabla ALUMNOS y CURSOS para obtener los alumnos junto al curso Con LIKE ‘%cadena%’ selecciona registros cuya que realizan. Para realizar esta relación “cadena” esta contenida dentro del campo a correctamente las tablas deben tener un campo comparar. de relación que en este caso es el campo “CURSO” de la tabla ALUMNOS con el CODIGO de la tabla Con LIKE ‘cadena%’ selecciona registros cuya CURSOS. “cadena” empieza por campo a comparar. //Selecciona el nombre, el apellido de la tabla alumnos Con LIKE ‘%cadena’ selecciona registros cuya // y el curso de la tabla cursos “cadena” termina por campo a comparar. SELECT ALUMNOS.NOMBRE, ALUMNOS.APELLIDO, CURSOS.CURSO FROM ALUMNOS, CURSOS Si sabemos de antemano que la ejecución de una WHERE ALUMNOS.CURSO = CURSOS.CODIGO; sentencia de selección va a devolver una gran cantidad de registros, se puede limitar esta cantidad Y el resultado obtenido es: de registros. //Devuelve solo los 10 primeros registros de la selección SELECT * FROM ALUMNOS LIMIT 10; //Devuelve 15 registros a partir de la posición 30 SELECT * FROM ALUMNOS LIMIT 30,15; Página 6 PC PASO A PASO Nº 21
  • 7. Programación PHP - Programación PHP - Programación PHP - Programación PHP Actualizar Si queremos modificar todos los registros de una tabla, simplemente no deberemos añadir la opción WHERE a la instrucción UPDATE. Para conseguir modificar el contenido de una base de datos utilizaremos la instrucción UPDATE. Comprenderemos mejor su funcionamiento a través //Modifica el contenido de la edad de María de la tabla alumnos de los siguientes ejemplos. UPDATE ALUMNOS SET EDAD = 25 Si queremos modificar el contenido de un campo Y el resultado obtenido es: de un registro en concreto utilizaremos la instrucción UPDATE seguida de la opción WHERE para filtrar el registro que queremos modificar. //Modifica el contenido de la edad de María de la tabla alumnos UPDATE ALUMNOS SET EDAD = 25 WHERE CODIGO = ‘A1’; Y el resultado obtenido es: Insertar Para añadir o insertar nueva información en una base de datos utilizaremos la instrucción INSERT. Veremos el funcionamiento de INSERT a través de los siguientes ejemplos. Si queremos modificar más de un campo del mismo registro, añadiremos tantos campo=valor separados //Añade un registro a la tabla alumnos por comas, como campos queramos modificar. INSERT INTO ALUMNOS (CODIGO, NOMBRE, APELLIDO, PAIS, EDAD, CURSO) //Modifica el contenido de la edad de María de la tabla alumnos VALUES (‘A5’, ‘Sabina’, ‘Campoy’, ‘España’, 17, ‘C1’); UPDATE ALUMNOS SET EDAD = 25, CURSO = ‘C2’ WHERE CODIGO = ‘A1’; Y el resultado obtenido es: Y el resultado obtenido es: Es importante recordar el tipo de dato que puede almacenar cada campo. Las inserciones de datos Si queremos modificar más de un registro al mismo tipo string deben ir entre comillas, en cambio los tiempo en la opción WHERE deberemos aplicar un de tipo numérico no. filtro que afecte a más de un registro. En el uso de INSERT no es necesario especificar //Modifica el contenido de la edad de María ningún filtro (WHERE), ya que la inserción no afecta //de la tabla alumnos a ningún registro en particular, si no que afecta a UPDATE ALUMNOS SET EDAD = 25 una tabla específica. WHERE CURSO = ‘C1’; Borrar Y el resultado obtenido es: La instrucción DELETE borra un determinado registro de una tabla, para especificar los registros que queremos eliminar lo haremos añadiendo la opción WHERE. Al igual que con la instrucción UPDATE, si no se especifica la opción WHERE, el borrado afectará a todos los registros de la tabla. PC PASO A PASO Nº 21 Página 7
  • 8. Programación PHP - Programación PHP - Programación PHP - Programación PHP //Elimina al alumno A2 DELETE FROM ALUMNOS WHERE CODIGO = ‘A2’; En el caso de que se haga una llamada a mysql_connect() con los mismos argumentos, no //Elimina a los alumnos del curso C1 se establecerá un nuevo enlace, sino que se DELETE FROM ALUMNOS WHERE CURSO = ‘C1’; devolverá el enlace ya abierto. Esto consigue //Elimina a todos los alumnos optimizar recursos, ya que más de un enlace abierto DELETE FROM ALUMNOS; solo consumiría más recursos para obtener los mismos resultados. PHP – BBDD (MySQL) El enlace al servidor se cerrará tan pronto como la PHP dispone de un conjunto de funciones que ejecución del script PHP finalice, es decir cuando forman la API que permite utilizar la base de datos termine la ejecución de la página PHP, a menos que MySQL. Estas funciones se encuentran optimizadas se cierre antes explícitamente llamando a para sacar el máximo rendimiento a MySQL, por mysql_close(). lo tanto serán mucho más rápidas que acceder a MySQL a través de ODBC. La lista de funciones en En el siguiente ejemplo se muestra el proceso de PHP que manejan el API de MySQL es muy amplia, conexión a un servidor MySQL que está en la misma a continuación veremos las funciones más máquina (localhost) donde está el Servidor Web. El importantes. El listado completo de todas las usuario es “pepe” y la contraseña es “12colina34” funciones lo podemos encontrar en la página web oficial de PHP (www.php.net). mysql_connect(“localhost”, “pepe”, “12colina34”); mysql_connect Si el puerto es diferente al puerto por defecto y no es necesario especificar el usuario y password: Abre una conexión a un servidor MySQL mysql_connect(“localhost:3345”, “”, “”); La sintaxis de la función es la siguiente: int mysql_connect ( [string servidor [string Lo más práctico a la hora de realizar aplicaciones :puerto/path_to_socket] [, string usuario [, string es declarar la conexión a la base de datos en un password]]]) fichero php independiente y después incluir este fichero en aquellas páginas que necesiten una La función devuelve un valor numérico de tipo int que identifica la conexión con el servidor MySQL. conexión a la base de datos. Servidor: nombre o dirección IP del servidor donde está la base de datos. <?php Puerto: puerto por el que se accede a la base de $servidor = “127.0.0.1”; datos. $usuario = “root”; Path_to_socket: el socket que el servidor está utilizando para escuchar las peticiones (sólo en $clave = “admin”; Unix) $miconexion = mysql_connect($servidor, $usuario, Usuario: nombre del usuario para realizar la $clave); conexión a la base de datos. ?> Password: clave del usuario para realizar la conexión a la base de datos. Si al ejemplo anterior lo llamamos “conexion.php” La función mysql_connect() establece una conexión deberemos incluir el siguiente código en nuestras a un servidor MySQL. Todos los argumentos son páginas: opcionales, y si no se especifican, se asumen los valores por defecto: <?php servidor: localhost include (“conexion.php”); puerto: 3306 ?> path_to_socket: /tmp/mysql.sock usuario: usuario propietario del proceso del Para poder conectarnos a la base de datos, debemos servidor indicar en los parámetros de la conexión un usuario password: password vacia. y contraseña válidos y existentes como usuarios en El servidor también puede incluir un número de la base de datos. Recuerda que en el tema anterior puerto (localhost:3306) o un camino al socket aprendimos una administración básica de la MySQL (:/camino/al/socket) para localhost. a través de phpmyadmin. Página 8 PC PASO A PASO Nº 21
  • 9. Programación PHP - Programación PHP - Programación PHP - Programación PHP mysql_select_db Sentencia: la sentencia SQL que será enviada al servidor para su ejecución. Selecciona la base de datos con la que se va a Identificador_conexión: el identificador de la trabajar de entre todas las existentes en el servidor. conexión sobre la que el comando de SQL será enviado al servidor de la base de datos. La sintaxis de la función es la siguiente: La función mysql_query() envía una sentencia a la int mysql_select_db ( string base_de_datos [, int base de datos activa en el servidor asociada al identificador_de_enlace]) identificador de enlace. Si no se especifica un identificador_conexion, se asumirá el último enlace Devuelve TRUE si éxito, FALSE si error. abierto. Si no hay ningún enlace abierto, la función Los argumentos de la función son: intenta establecer un enlace como si se llamara Base_de_datos: nombre de la base de datos a función mysql_connect() sin argumentos, y lo utiliza. seleccionar. Identificador_conexión: identificador de la La función mysql_query() devuelve TRUE (no-cero) conexión. o FALSE para indicar si la sentencia se ha ejecutado correctamente o no. Un valor TRUE significa que <?php la sentencia era correcta y pudo ser ejecutada en mysql_select_db(“pruebas”, $miconexion); el servidor. No indica nada sobre el número de fila devueltas. Es perfectamente posible que la sentencia ?> se ejecute correctamente pero que no devuelve ninguna fila. La función mysql_select_db() establece la base de datos activa que estará asociada con el identificador <?php de conexión especificado. Si no se especifica un $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”; identificador de conexión, se asume el ultimoúltimo $id_query = mysql_query($consulta, $miconexion); enlace abierto. Si no hay ningún enlace abierto, la función intentará establecer un enlace como si se ?> llamara a mysql_connect(). Asumiendo que la sentencia tenga éxito, se puede llamar a mysql_affected_rows() para saber cuantas Ahora modificaremos el include conexión para filas fueron afectadas (para DELETE, INSERT, añadirle la línea de selección de la Base de Datos REPLACE, o UPDATE). Para las sentencias SELECT, donde hemos dado de alta las tablas ALUMNOS y mysql_query() devuelve un nuevo identificador de CURSOS. resultado que se puede pasar a mysql_result(). Cuando se acabe de utilizar el resultado, se pueden <?php liberar los recursos asociados utilizando $servidor = “127.0.0.1”; mysql_free_result(). $usuario = “root”; $clave = “admin”; mysql_result $miconexion = mysql_connect($servidor, $usuario, Devuelve el dato solicitado de un identificador $clave); generado por la sentencia mysql_query. mysql_select_db(“aprende_php”, $miconexion); La sintaxis de la función es la siguiente: ?> int mysql_result ( int id_consulta, int numero_de_fila [, mixed campo]) mysql_query Los argumentos de esta función son: Id_consulta: es el identificador de la consulta Envía una sentencia SQL a MySQL para que realizada con mysql_query() se ejecute Numero_de_fila: fila a la que se accede para leer el dato. La sintaxis de la función es la siguiente: Campo: campo de la fila que se quiere obtener. int mysql_query ( string sentencia [, int La función mysql_result() devuelve el contenido de identificador_conexión]) una celda de un resultado MySQL. El argumento campo puede ser el nombre del campo o Los argumentos utilizados en esta función tabla.nombre_del_campo. Si el nombre de la son: columna tiene un alias (campo as campo1), PC PASO A PASO Nº 21 Página 9
  • 10. Programación PHP - Programación PHP - Programación PHP - Programación PHP utilizaremos el alias en lugar del nombre de la <?php columna. include (“conexion.php”); $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”; <?php $id_query = mysql_query($consulta, $miconexion); include (“conexion.php”); while ($fila = mysql_fetch_array($id_query)) { $consulta = “SELECT NOMBRE, APELLIDO FROM print(“Nombre:” . $fila[“NOMBRE”] . “<br>”); ALUMNOS”; } $id_query = mysql_query($consulta, $miconexion); ?> $result1 = mysql_result($id_query, 1, 1); // fila 1, columna 1 $result2 = mysql_result($id_query, 2, 1); // fila 2, columna 1 Al ejecutar el código anterior obtenemos print(“result1: ” . $result1 . “<br>”); el siguiente resultado: print(“result2: ” . $result2 . “<br>”); ?> Para acceder a los datos se utiliza como índice del array el nombre del campo que lo Para operar con la función mysql_result() debemos identifica o bien la posición imaginarnos el resultado de la consulta como una que ocupa en la selección. matriz: Devuelve un array que corresponde al resultado de la consulta, o FALSE si no quedan más filas. La función mysql_fetch_array() es una versión extendida de mysql_fetch_row(). Además de guardar los datos en el índice numérico de la matriz, guarda también los datos en los índices asociativos, usando El resultado de ejecutar el ejemplo anterior es: el nombre de campo como clave. Cuando se trabaja con un Si dos o más columnas del resultado tienen el mismo gran resultado, debe nombre de campo (puede pasar al relacionar tablas), considerarse la utilización de la última columna toma la prioridad. Para acceder una función que devuelva una a la(s) otra(s) columna(s) con el mismo nombre, fila entera ya que estas funciones son MUCHO mas se debe especificar el índice numérico o definir un rápidas que mysql_result(). alias para la columna. Especificando un offset La función mysql_fetch_array() no es numérico en lugar del n o m b r e d e l c a m p o, l a significativamente mas lenta que mysql_fetch_row(), ejecución será mas rápida. sin embargo tiene un valor añadido importante. Las llamadas a mysql_result() no deben mezclarse con llamadas a las otras sentencias que trabajan mysql_num_rows con un identificador de resultado. Devuelve el número de filas de un resultado La mysql_fetch_array sintaxis de la función es la siguiente: int mysql_num_rows ( int id_resultado) Extrae la fila de resultado como un array asociativo. La sintaxis de la función es la siguiente: La función mysql_num_rows() devuelve el numero array mysql_fetch_array ( int id_resultado [, de filas de un identificador de resultado. int tipo_de_resultado]) En el siguiente ejemplo utilizaremos el número de Los argumentos de la función son: filas seleccionadas para crear un bucle e ir mostrando Id_resultado: identificador de resultado devuelto el valor del campo “nombre” de todas las filas por mysql_query(). seleccionadas. Utilizamos la variable del bucle $i Tipo_de_resultado: constante que indica el tipo de array que devuelve. Puede tomar los valores para indicar la fila en mysql_result(). MYSQL_NUM, MYSQL_ASSOC y MYSQL_BOTH. Página 10 PC PASO A PASO Nº 21
  • 11. Programación PHP - Programación PHP - Programación PHP - Programación PHP <?php <?php include (“conexion.php”); include (“conexion.php”); $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”; $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”; $id_query = mysql_query($consulta, $miconexion); $id_query = mysql_query($consulta, $miconexion); $filas = mysql_num_rows($id_query); $campo = mysql_field_name($id_query, 0); for ($i=0; $i<$filas; $i++) { print(“campo: ” . $campo . “<br>”); $campo = mysql_result($id_query, $i, “NOMBRE”); ?> print(“campo ” . ($i + 1) . “: ” . $campo . “<br>”); Al ejecutar el código anterior } obtenemos el siguiente resultado: ?> Por razones de compatibilidad puede Al ejecutar el código anterior usarse tambientambién obtenemos el siguiente mysql_fieldname(). resultado: mysql_field_type Por razones de compatibilidad puede usarse también Devuelve el tipo de dato del campo especificado en un resultado. mysql_numrows(). La sintaxis de la función es la siguiente: string mysql_field_type ( int id_resultado, int indice_del_campo) mysql_field_name La función mysql_field_type() es similar a la función Devuelve el nombre del campo especificado en un resultado La mysql_field_name(). Los argumentos son idénticos, pero se sintaxis de la función es la siguiente: devuelve el tipo de campo. El tipo será "int", "real", "string", string mysql_field_name ( int id_resultado, int indice_del_campo) "blob", u otros detallados en la documentación de MySQL. La función mysql_field_name() devuelve el nombre del campo <?php especificado. Los argumentos de la función son el identificador include (“conexion.php”); de resultado y el índice del campo. Devolverá el nombre del $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOS”; campo asociado. $id_query = mysql_query($consulta, $miconexion); $tipo = mysql_field_type($id_query, 0); print(“tipo: ” . $tipo . “<br>”); ?>
  • 12. Programación PHP - Programación PHP - Programación PHP - Programación PHP Al ejecutar el código anterior obtenemos el siguiente mysql_errno resultado: Por razones de compatibilidad Deuelve el número del mensaje de error de la última puede usarse también operación MySQL. La sintaxis de la función es: mysql_fieldtype(). int mysql_errno ( [int identificador_conexion]) mysql_create_db <?php include (“conexion.php”); Crea una nueva base de datos $consulta = “SELECT NOMBRE, APELLIDO FROM MySQL después de haber ALUMNOOS”; realizado una conexión al $id_query = mysql_query($consulta, $miconexion); servidor. La sintaxis de la función es la siguiente: print(“Error: ” . mysql_errno($miconexion) . “<br>”); ?> int mysql_create_db ( string base_de_datos [, int Al ejecutar el código anterior identificador_conexion]) obtenemos el siguiente resultado: Los argumentos utilizados en esta función son: Base_de_datos: nombre de la base de datos a La ejecución del ejemplo crear. anterior generará un error Identificador_conexión: identificador de la debido a que la tabla conexión. ALUMNOS está mal escrita. La función mysql_create_db() intenta crear una nueva base de datos en el servidor asociado al mysql_error identificador de conexión. Devuelve el texto del mensaje de error de la última operación MySQL. La sintaxis de la función es la <?php siguiente: mysql_create_db(“pruebas”, $miconexion); string mysql_error ( [int identificador_de_enlace]) ?> Los errores devueltos por mySQL no se indican en Por razones de compatibilidad puede usarse los warnings, Por lo tanto debemos usar estas mysql_createdb() igualmente. funciones para encontrar el número de error. <?php mysql_drop_db include (“conexion.php”); $consulta = “SELECT NOMBRE, APELLIDO FROM ALUMNOOS”; Borra una base de datos MySQL. La sintaxis de la $id_query = mysql_query($consulta, $miconexion); función es la siguiente: print(“Error”.mysql_errno($miconexion).“:”.mysql_error($miconexion).“<br>”); int mysql_drop_db ( string base_de_datos [, int ?> identificador_conexion]) Al ejecutar el código anterior obtenemos el Devuelve TRUE si éxito, FALSE si error. siguiente resultado: Los argumentos de la función son: En el próximo Base_de_datos: nombre de la base de datos a borrar. número ... Identificador_conexión: identificador de la Pues con este número conexión. damos por terminado los conceptos básicos de <?php PHP, ahora toca aplicar todo lo aprendido para mysql_drop_db(“pruebas”, $miconexion); crear aplicaciones Web seguras. En el próximo ?> número comenzaremos a explicar como La función mysql_drop_db() intenta suprimir una programar aplicaciones seguras utilizando PHP. base de datos completa del servidor asociado al identificador de enlace. Página 12 PC PASO A PASO Nº 21
  • 13. CURSO DE TCP/IP: 4ª ENTREGA TCP (TRANSMISION CONTROL PROTOCOL) 2ª parte Este mes nos metemos de lleno en los paquetes de Internet. Crearemos un paquete desde cero, nos adentraremos en el código binario y para rematar comprenderemos de una vez por todas el significado de algunos ataques ya conocidos por todos. 1. Fundamentos de la esos ceros y unos de los que vamos a hablar comunicación digital. ahora. Cuando empecé con el curso de TCP/IP, cuya De momento, nos quedaremos con una cuarta entrega tenéis ahora mismo en vuestras simplificación de la idea de qué es exactamente manos, ya os advertí de que, cansado de ver un cero y un uno. Como sabemos, los datos una y otra vez las mismas técnicas para que circulan en una red lo hacen siempre a explicar los conceptos en todos los libros y través de un medio físico. Este medio, tutoriales, este curso pretendía ser una normalmente, será un cable eléctrico, pero apuesta arriesgada, orientando la explicación puede ser también, por ejemplo, una onda de de los mismos conceptos desde un punto de radiofrecuencia, un cable óptico, o cualquier vista bastante diferente. otro medio físico empleado en la interconexión de máquinas. Quedémonos con el caso más Siguiendo en esta línea un tanto experimental, común, el del cable eléctrico, aunque todo lo voy a dar otro nuevo paso que no he visto explicado se puede extrapolar, por supuesto, en ningún libro sobre TCP/IP, para tratar de a cualquier otro medio físico. que os familiaricéis más aún con TCP/IP. Como es lógico, por un cable eléctrico circula Lo que pretendo conseguir ahora es que electricidad. La electricidad por si misma no convirtáis esos misteriosos paquetes TCP que contiene mucha información. Un medio de tenéis rondando ahora mismo por vuestras transmisión de información será más versátil cabezas, en algo tangible, de carne y hueso, cuantos más parámetros posea. o más bien debería decir de unos y ceros. Por ejemplo, una imagen puede transmitir Para ello, vamos a ver con un ejemplo cómo una gran cantidad de información (ya se sabe está construido exactamente un paquete TCP. que una imagen vale más que mil palabras), Mi intención es que después de este ejemplo, ya que posee muchísimos parámetros, como los paquetes TCP dejen de ser al fin para son los colores en cada punto, la iluminación, vosotros unos entes teóricos de los cuales etc. En cambio, la electricidad posee pocos conocéis el funcionamiento, pero no su parámetros propios, como pueden ser la constitución “física”. tensión eléctrica (voltaje), y la intensidad eléctrica (corriente). Para colmo, estos dos Por supuesto, esta constitución física no parámetros están directamente relacionados podremos terminar de comprenderla hasta entre sí (¿recordáis la famosa ley de Ohm, o que lleguemos a la capa inferior de la jerarquía vosotros también suspendíais física en el cole? de capas de TCP/IP: el nivel físico. Así que habrá que esperar aún unos cuantos meses Por tanto, una primera solución intuitiva para antes de que veamos qué son exactamente transmitir información por medio de la PC PASO A PASO Nº 21 Página 13
  • 14. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) electricidad sería hacer variar esos parámetros Siempre habréis escuchado el término en función de lo que quisiéramos transmitir. analógico como opuesto al término digital. Vamos a ver ahora mismo en qué consisten Por ejemplo, si queremos transmitir un las diferencias entre analógico y digital. número, podemos ajustar el voltaje del cable en relación directa con el valor de ese número. Si bien la tecnología analógica aprovecha la Por ejemplo, para transmitir un 5 pondríamos tensión eléctrica, uno de los parámetros que 5 voltios en el cable, y para transmitir un 7 caracterizan la electricidad que circula por un pondríamos 7 voltios en el cable. Si, en cable, la tecnología digital no utiliza ninguno cambio, queremos transmitir el número de los parámetros de la electricidad para 250000, más nos vale no tocar el “cablecito”, transmitir la información. a no ser que queramos seguir este curso desde el más allá (allí también llega, desde ¿Cómo puede transmitirse la información que la revista cambió de distribuidor). entonces? Evidentemente, siempre es imprescindible la presencia de una variable Supongo que las mentes más despiertas que se pueda modificar convenientemente habrán descubierto ya aquí una de las más para codificar la información que se desea destructivas técnicas de hacking. Si algún día transmitir. La diferencia es que en el caso de os encontráis por un chat al <malnacido> ese la transmisión digital el parámetro que se que os robó la novia, basta con que le enviéis utiliza para portar la información no es un paquete que contenga un número tocho inherente a la propia electricidad, si no que con ganas, como el 176874375618276543, es un parámetro más sencillo: el tiempo. y por su módem circulará tal tensión eléctrica, que en el lugar que ocupaba su casa veréis Evidentemente, el tiempo es siempre un un cono atómico que ni el de Hiroshima. parámetro fundamental en toda comunicación, ya que es imprescindible que haya una Bueno, antes de que se me eche alguien sincronización temporal entre transmisor y encima por decir semejantes estupideces, receptor. tendré que reconocer que, como es lógico, las cosas no funcionan así en la práctica. Volviendo al caso de la transmisión analógica, ¡Pero no os creáis que sea algo tan pensemos por ejemplo en el caso en el que descabellado! ¿Y si en lugar de una proporción se transmitan sólo números del 0 al 9 y, para 1/1 utilizamos otra clase de proporcionalidad conseguir representar números más altos lo para transmitir los números? que se hace es transmitir cada una de sus cifras por separado (unidades, decenas, Por ejemplo, supongamos que no queremos centenas, etc.). Si, por ejemplo, quisiéramos superar los 10 voltios y, en cambio, queremos t ra n s m i t i r e l n ú m e r o 5 2 3 , p r i m e r o transmitir números entre 1 y 1000. Pues basta transmitiríamos 5 voltios, luego 2 voltios, y con que establezcamos el convenio de que por último 3 voltios. 10 voltios equivalen al número 1000 y, por tanto, 5 voltios al 500, 2’5 voltios al 250, etc., En la imagen podemos etc. ver la transmisión del número 523 por una Esta solución no sólo es mucho más realista, línea analógica. En el eje si no que incluso ha sido el sistema de X (el horizontal) se transmisión de información en el que se ha representa el tiempo, por basado toda la electrónica hasta que llegó la ejemplo, en segundos, y revolución digital. Y el nombre de esto os en el eje Y (el vertical) sonará mucho, ya que a esto es a lo que se se representa la tensión en voltios. llama comunicación ANALÓGICA. Página 14 PC PASO A PASO Nº 21
  • 15. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) Lógicamente, es necesario establecer un Por tanto, si queremos transmitir digitalmente convenio entre el transmisor y el receptor el número 9, estos serán los voltajes que para saber cuánto tiempo tiene que pasar tendremos que poner en la línea: entre la transmisión de cada cifra. Si no fuese así, imaginad lo que pasaría si tratásemos de Es decir, primero 1 voltio transmitir el número 5551. Si la línea se durante un segundo, mantiene en 5 voltios el tiempo necesario luego 0 voltios durante para transmitir las tres primeras cifras, ¿cómo dos segundos y, por podrá saber el receptor que en ese tiempo último, 1 voltio durante se han transmitido tres cincos, y no sólo uno, el último segundo. o doce? ¿Cómo podemos entonces transmitir un Por tanto, ha de existir un convenio previo número de dos cifras, como por ejemplo el entre emisor y receptor que diga “cada 12? segundo se transmitirá una nueva cifra”. Por Pues de nuevo hay que hacer otro convenio tanto, si pasado un segundo el voltaje no ha entre el emisor y el receptor y decir: “cada cambiado, significa que la siguiente cifra es cifra decimal va a constar de 4 cifras binarias”. igual a la anterior. Por tanto, si transmitimos la secuencia: “0001 0010” (ver la tabla anterior) estaremos Lo que hace la tecnología digital es explotar transmitiendo el número 12, según el convenio al máximo este tipo de “convenios”. Pero preestablecido, tal y como vemos en la empecemos viendo el caso más simple de siguiente imagen. todos, que es igual al caso de la transmisión analógica. Imaginemos que queremos transmitir números pero que sólo puedan ser 0 o 1. En ese caso, la cosa funcionaría igual: a cada segundo una De esta manera, a base de acuerdos entre el nueva cifra, y no hay más misterio. La transmisor y el receptor, podemos transmitir diferencia sería que la tensión sólo podría cualquier información, con sólo transmitir ceros tener dos valores: 0 o 1 voltios. y unos. La diferencia viene cuando queremos transmitir números más grandes, que es ¿Cuál es la ventaja de transmitir sólo dos cuando hay que hacer “convenios raros”. valores en lugar de variar el voltaje en función del valor que se desea transmitir? Pues son En realidad, estos convenios tienen poco de varias las ventajas, pero la más obvia es la raro, al menos para un matemático, ya que gran fiabilidad de la transmisión. no es ninguna invención, si no simplemente una aplicación directa de las matemáticas. Imaginemos que nuestro cable lo hemos Concretamente, lo que se aplica es la comprado en el Todo a 100 y falla más que aritmética binaria. una escopeta de feria. Pretendemos transmitir 5 voltios y, en cambio, unas veces el cable Este “convenio” asigna transmite 4 voltios, otras veces 3,5, otras una secuencia veces 2... diferente para representar cada Estos fallos del cable serían críticos en una número decimal, que transmisión analógica, ya que el voltaje se podemos ver en la traduce directamente en la información que tabla de la izquierda. transmitimos. En cambio, la transmisión digital PC PASO A PASO Nº 21 Página 15
  • 16. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) nos permite unos márgenes de error muy grandes. Al fin y al cabo, transmitir ceros y ! ¿Y si el mundo... unos se limita tan sólo a diferenciar “no hay electricidad en el cable” de “sí hay electricidad ¿Y si el mundo fuese distinto? en el cable”. 1. Muchas personas, cuando les dices que el mundo informático Por tanto, podemos decir por ejemplo: “si funciona con CEROS y UNOS, nunca llegan a entenderlo. Con hay menos de un voltio en el cable, lo sencillo que sería trabajar con el sistema decimal consideramos que es un cero. Si hay más de (0,1,2,3,4,5,6,7,8,9) e incluso con letras. un voltio, consideramos que es un uno”. Así, todos esos fallos del cable de Todo a 100 no Acabamos de descubrir que aplicar el sistema decimal supondría afectarían a la transmisión digital, ya que 10 niveles de voltaje en un cable eléctrico, algo técnicamente incluso 2 voltios seguiría siendo considerado posible pero MUY CARO. Como ya hemos dicho los cables como “sí hay electricidad en el cable” y, por deberían ser muy buenos y los dispositivos que detectasen los tanto, sería considerado como un 1. cambios de voltaje deberían ser muy precisos. Pero esto es hablando del mundo analógico… si nos vamos al digital la cosa Son muchas otras las ventajas de lo digital se pone interesante. frente a lo analógico, como la mayor facilidad a la hora de almacenar y procesar la Hemos dicho que en el MUNDO DIGITAL solo hay dos estados, información, pero esas ventajas no se deducen es decir, "unos" (abierto, con electricidad, iluminado) y ceros de lo explicado hasta ahora, por lo que no (cerrado, sin electricidad, apagado). Pero ¿por qué? ¿por qué el entraremos ahora en más detalle. De hombre ha decidido que el mundo digital solo tenga dos estados momento, la idea con la que nos tenemos en lugar de 10? que quedar es con que a la hora de transmitir información, la transmisión digital tiene una Muy sencillo, POR DINERO!!! ¿Cómo? ¿qué?... … En el diminuto mayor inmunidad al ruido y, en general, a universo que conocemos, nuestro planeta, es muy sencillo (y cualquier error, que la transmisión analógica. barato) encontrar sustancias que sean capaces de tener dos estados claramente diferenciados, que puedan ser capaces de pasar de un Por supuesto, nada de lo explicado hasta estado a otro muy rápidamente, que lo hagan de forma barata y ahora es en la práctica tal y como lo he para colmo que sea muy fácil detectar esos estados. contado (para aquellos que sepan de qué va el tema y estén flipando), pero mi intención Al igual que una bombilla puede estar encendida o apagada y no es escribir un RFC sobre transmisión todos podemos percibirlo mirándola (luz/oscuridad) o tocándola analógica vs. transmisión digital, si no tan (calor/frío), en el caso de la informática EL DIOS ES EL SILICIO. sólo explicar conceptos, aunque tenga que Simplificando mucho el tema, podemos decir el silicio deja pasar ser faltando a la realidad en muchas la electricidad o no (ceros y unos), lo hace rapidísimamente (todos ocasiones. Lo importante es que comprendáis queremos tener un PC ultrarrápido) y detectar el estado ("cargado" los conceptos que subyacen a una transmisión o "descargado") es tecnológicamente sencillo y por lo tanto barato. de datos digitales, como es el caso de TCP/IP. ¿Y si el mundo fuese distinto? Para los más quisquillosos que sigan Imagina otro elemento, por ejemplo el agua. Todos conocemos insistiendo en que las cosas no son así, y que tres de sus estados, el sólido, el líquido y el gaseoso… si el agua realmente incluso las transmisiones digitales se pareciese al silicio (si fuese sencillo pasar de un estado a otro, circulan de forma analógica, insisto en que lo hiciese a la velocidad del rayo y fuese sencillo detectar esos no estoy tratando de explicar el nivel físico cambios de estado)… nuestro ordenador estaría basado en un (cosa que ya haré dentro de unos cuantos procesador de agua y, en ese caso… sería MUCHO más potente artículos, y donde todo esto quedará y rápido que los que ahora tenemos basados en silicio. finalmente aclarado), si no tan sólo abstraerme de los detalles para explicar los ¿Qué? ¿Cómo? Sí, porque tendríamos un sistema de TRES estados (apagado -hielo-, neutro -líquido- y encendido -gaseoso-) conceptos básicos. Página 16 PC PASO A PASO Nº 21
  • 17. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) los ordenadores personales, llamamos byte. en lugar de DOS estados (apagado/encendido). Eso significa que Un byte es simplemente una palabra de 8 bits, en lugar del código BINARIO utilizaríamos el código TRINÁRIO es decir, de 8 cifras binarias (cero o uno). Si (el nombre me lo acabo de inventar). Al haber tres estados en quisiéramos representar los números decimales lugar de dos podríamos crear convenios mucho más optimizados, con un byte, ésta podría ser la tabla es decir, transmitir información de forma mucho más optimizada correspondiente: y por lo tanto mucho más rápida. Deja volar tu imaginación… si un buen día alguien encuentra (o fabrica, o trae de otra galaxia) un material parecido al silicio pero que pudiese tener 600 estados en lugar de dos… bufff… el mundo informático daría un salto astronómico en velocidad de cálculo. Para la humanidad sería comparable al paso de la edad de Piedra a la edad de Hierro. Actualmente, a falta de materiales nuevos los científicos intentan utilizar elementos conocidos pero difíciles de "controlar". Unos basados en dos estados y otros en multiestados… por ejemplo los átomos. Vamos al fin a ver algo directamente Al final, la orgullosa humanidad depende de los materiales que relacionado con TCP. Volvamos al último artículo su "humilde" entorno proporciona. de la revista, y repasemos la cabecera TCP. Por si no lo tenéis a mano, aquí os la vuelvo a mostrar. 2.- Codificación binaria. Llegados a este punto, posiblemente ya habréis perdido un poco de miedo a eso de los ceros y los unos. Lo que nos queda por ver es cómo se codifica realmente la información en binario (utilizando tan sólo ceros y unos), es decir, cuáles son los “convenios” reales de los que hemos hablado, que permiten que un transmisor y un receptor se puedan entender. Es aquí donde entra el concepto fundamental de palabra (word). La forma en que se Como vemos, en la cabecera TCP se manejan representa la información depende del tamaño distintos tamaños de palabra. En primer lugar, de la palabra utilizada. En el ejemplo anterior, para los campos puerto origen y puerto donde representábamos cada número decimal destino contamos con 16 bits, después, para con 4 cifras binarias, es decir, con 4 bits (bit los números de secuencia y de es simplemente el nombre dado a una cifra confirmación tenemos 32 bits, 4 bits para binaria, es decir, un número que sólo puede el campo comienzo de datos, 1 bit para cada ser un cero o un uno), teníamos una palabra uno de los flags, etc. de 4 bits para representar los números decimales. Para saber cuántos valores se pueden representar con cada tamaño de palabra, basta La palabra más comúnmente utilizada en con hacer la potencia de 2 con el tamaño informática es el octeto que, en el caso de de la palabra en bits. Es decir, con una PC PASO A PASO Nº 21 Página 17
  • 18. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) 4 palabra de 4 bits podemos representar 2 = 2.1. P a s a n d o d e b i n a r i o a 16 valores diferentes, con una palabra de 8 8 16 decimal bits 2 = 256 valores, con 16 bits 2 = 65536, etc. Vamos a ver en primer lugar cómo traducir una secuencia de ceros y unos en algo Ahora podéis comprender por qué todo lo comprensible para nuestras mentes decimales. relacionado con la tecnología digital sigue siempre estos números. La memoria RAM que En la base decimal, que es la que nosotros compras para el PC, las tarjetas de memoria utilizamos, llamamos a cada cifra de una para la cámara digital, la velocidad del ADSL, manera diferente según el orden que ocupa: siempre son los mismos números; 8, 16, 32, unidades, decenas, centenas, etc. Como nos 64, 128, 256, 512, 1024, 2048... Todos esos explicaron en los primeros años del cole, para números son las diferentes potencias de 2. calcular un número a partir de su representación decimal, tenemos que sumar El caso más sencillo es el de 1 único bit, 1 las unidades a las decenas multiplicadas por donde tenemos 2 = 2, es decir, se pueden diez, las centenas multiplicadas por 100, etc., representar sólo 2 valores con 1 bit. Estos 2 etc. Es decir: 534 = 5 * 100 + 3 * 10 + 4 * 1. valores son, por supuesto: cero, y uno. 2 En realidad, 100 es una potencia de 10 (10 En el caso, por ejemplo, de 3 bits, tenemos 3 = 100). Y por supuesto 10 también es una 2 = 8 valores diferentes, que son todas las 1 potencia de 10 (10 = 10). pero también el posibles combinaciones de 3 cifras, donde 1 lo es, ya que 1 es potencia de cualquier cada cifra puede ser un uno o un cero, tal y 0 número, pues X = 1, donde en este caso, es como vemos en la tabla. X = 10, es decir, 10 elevado a cero es uno. Como vemos, no Por tanto, el número 534 se puede representar quedan más 2 1 0 como: 534 = 5*10 + 3*10 + 4*10 . p o s i b l e s combinaciones de Esta regla se puede aplicar a cualquier otra ceros y unos con base que no sea 10. Volvamos a la tabla sólo 3 cifras, y anterior, y veremos que el número 7 se esto nos permite representa como 111 en base 2. representar tan sólo los números Si aplicamos la fórmula anterior, pero en este del 0 al 7. caso utilizando base 2, tendremos: 2 1 0 1 * 2 + 1*2 + 1*2 = 7. En efecto, se Como ya dije antes, para un matemático estos 2 1 0 cumple, ya que 2 = 4, 2 = 2, y 2 = 1, convenios para representar los números luego: 1*4 + 1*2 + 1*1 = 7. decimales mediante cifras binarias no son ningún misterio, ya que basta con aplicar las Con esta sencilla fórmula de las potencias de bases de la aritmética modular. 2 se puede convertir cualquier número binario a su equivalente en decimal. Por ejemplo, Voy a tratar de explicar rápidamente en qué vamos a traducir a decimal el número consisten estas fórmulas porque, aunque al 10011010. principio os puedan parecer complicadas, en 7 Empezamos aplicando la fórmula: 1*2 + realidad son realmente sencillas y, como todo, 6 5 4 3 2 1 0*2 + 0*2 + 1*2 + 1*2 + 0*2 + 1*2 es sólo cuestión de práctica el aplicarlas de 0 + 0*2 . Ahora, sabiendo los valores de cada forma natural. potencia de dos (cualquier geek que se precie tiene que conocer como mínimo todas las Página 18 PC PASO A PASO Nº 21
  • 19. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) potencias de 2 con exponentes de 0 a 16), Pero nosotros no nos conformamos con hacer podemos traducir esa fórmula en: 1*128 + las cosas, si no que nuestro auténtico interés 0*64 + 0*32 + 1*16 + 1*8 + 0*4 + 1*2 + es el saber cómo se hacen. Así que os explico 0*1. Es decir, nos queda la siguiente suma: rápidamente un algoritmo para convertir 128 + 16 + 8 + 2 = 154. Por tanto, el número cualquier número decimal a binario. binario 10011010 representa al número 154 en decimal. Usemos para el ejemplo el número 137. Por si queréis practicar, os dejo como ejercicio El proceso a seguir será ir dividiendo el algunos números más, con su traducción, número (en este caso 137) por 2 y, en cada para que lo comprobéis vosotros mismos: división, quedarnos con el resto de la división (que sólo podrá ser cero o uno). Ahora te 10110101 = 181 quedará claro. 00111100 = 60 111010001010101010100101 = 15248037 El resultado de la primera división (llamado cociente, en 2.2. Pasando de decimal a verde) es 68, y el resto (en binario. rojo) es 1. Este 1 será el bit Aquí la cosa ya se pone más chunga. Aun así, menos significativo, es decir, la cifra binaria juraría que esto ya lo expliqué en alguno de que está a la derecha del todo. mis artículos. Continuamos el proceso con el nuevo cociente Hay varios trucos para convertir de decimal que hemos obtenido: a binario. El más sencillo, por supuesto, es meter el número en la calculadora de windows, Ahora hemos obtenido un 0, y luego pinchar en donde pone BIN para que que será la siguiente cifra lo pase automáticamente, jeje. binaria. Continuamos el proceso con el nuevo cociente, 34: 3 4 / 2 = 1 7 , con re st o 0. 17 / 2 = 8, con resto 1. 8 / 2 = 4, con resto 0. 4 / 2 = 2, con resto 0. 2 / 2 = 1, con resto 0. Esta última operación (en azul) es fundamental, ya que el bit más significativo, es decir, el que hay más a la izquierda, será el último cociente, es decir 2/2 = 1. Por tanto, el número 137 en binario nos quedará: 1 0 0 0 1 0 0 1. ! Para que... ! Si tienes... Para que a nadie se le ocurra enviar un mail diciendo que la calculadora de Windows no puede hacer eso, venga, lo explicamos Si tienes interés en avanzar por tu cuanta en cálculo binario, hay muy rápido. Abre la calculadora, Menu Ver y pulsa sobre Científica. miles de páginas en Internet que te lo explican perfectamente y Ya está por supuesto de forma gratuita. Busca en www.google.com y Ahora introduce cualquier número y pulsa sobre Bin avanza tanto como quieras PC PASO A PASO Nº 21 Página 19
  • 20. Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) - Curso de TCP/IP - TCP (II) Construyendo un paquete TCP El problema es que no hemos ajustado cada desde cero. campo a su tamaño de palabra. El tamaño de palabra de cada uno de estos dos campos Ya podemos ponernos manos a la obra con el es de 16 bits, por lo que cada uno de los dos tema que nos ocupa, que son los paquetes números obtenidos tiene que ser representado TCP. Vamos a recordar la cabecera TCP (volved con 16 cifras binarias. Para ello, habrá que atrás un poco para ver la imagen), y a ir poner el suficiente número de ceros a la campo por campo construyendo el paquete. izquierda, para rellenar las 16 cifras. Así, nos quedará: Vamos a poner como ejemplo, el primer 1345 = 0000010101000001 paquete que se envía cuando queremos 21 = 0000000000010101 establecer una conexión con un servidor de FTP. Ahora ya si que podemos concatenar ambos En primer lugar, tenemos que conocer los para conseguir la primera fila de la cabecera: puertos de origen y de destino (los dos primeros campos de la cabecera TCP). El 00000101010000010000000000010101 puerto de destino será el 21, que es el asignado por el estándar al servicio de FTP Como experimento, probad a convertir este (aunque bien sabréis muchos de vosotros que número en su equivalente decimal. El resultado no siempre se usa este puerto, como en el es 88145941. ¿Y qué nos dice este número? caso de los dumps, donde se suelen usar otros Pues absolutamente nada, ya que lo importante puertos menos “sospechosos”). a la hora de traducir un número de una base El puerto de origen será un puerto aleatorio a otra no es sólo la secuencia de cifras, si no asignado por el sistema operativo a la hora también el cómo se agrupen estas. Si de abrir el socket, es decir, la estructura agrupamos esta secuencia en grupos de 16, utilizada por el sistema para establecer la entonces si que tendrá un sentido, pero si la nueva conexión TCP/IP. Supongamos que el agrupamos en una única secuencia de 32 bits, sistema nos ha asignado el puerto 1345 como el número resultante no tiene ningún interés puerto de origen. para nosotros. Por tanto, es absolutamente imprescindible conocer el tamaño de las Ya tenemos los datos necesarios para rellenar palabras. la primera fila de la cabecera TCP. En primer lugar, tenemos que convertir el Vamos ahora con la segunda fila de la cabecera. número 1345 en su equivalente binario, y lo Como vemos, ahora nos toca el campo mismo con el número 21. número de secuencia. Este número también será asignado por el sistema operativo Aplicando el algoritmo explicado en el punto (recordemos del artículo anterior que no anterior, obtenemos: conviene que sea 0 cada vez que se establece 1345 = 10101000001 una nueva conexión). En nuestro ejemplo el 21 = 10101 sistema nos asignará el número 21423994. Para construir la primera fila de la cabecera Lo convertimos a binario, y nos da el número: TCP tenemos que concatenar el puerto origen 1010001101110011101111010. con el puerto destino, por lo que quedaría: 10101000001 10101. Este número es de 25 bits, por lo que habrá que poner 7 ceros a su izquierda, para Tenemos, por tanto, que nuestra primera fila completar los 32 bits de la palabra que consta de 16 bits... pero... no puede ser, si corresponde a este campo. Por tanto, la habíamos quedado en que cada fila de la segunda fila de nuestra cabecera TCP será: cabecera TCP eran 32 bits. 00000001010001101110011101111010 Página 20 PC PASO A PASO Nº 21