Explicación de strcspn, strip_tags, stripcslashes, stripos, stripslashes y stristr

Strcspn nos devuelve el número de caracteres que hay en una cadena que no aparecen en otra. Es complicado de explicar pero fácil de entender con algún ejemplo.

Su sentencia es:

Cadena1 será la cadena de texto que compararemos.
Cadena2 será la cadena de texto que tendrá los caracteres que no queremos contar.

Ejemplo


Strip_tags nos permite controlar los tags que queremos mostrar de una cadena de texto, incluso eliminarlos todos.

Su sentencia es:

Cadena es la cadena de texto entrante a la que vamos a realizarle los cambios.
tagsPermitidas es la cadena de texto en la que ponemos las tags que si que queremos permitir. Este parámetro es opcional, y si no ponemos nada, no se filtra ninguna y se eliminan todas.

Ejemplo

Texto de ejemplo";

echo strip_tags($cadena) . "
"; echo strip_tags($cadena, ""); //Solo vamos a filtrar la negrita, el resto no aparecerá. ?>

Devuelve:
Texto de ejemplo
Texto de ejemplo


Stripcslashes nos permite traducir a los símbolos unicode. Con un ejemplo se entiende:

Nos devuelve: ¶


Stripos nos devuelve la posición en la que se encuentra uno o varios caracteres dentro de una cadena.

Nos devuelve 6. En caso de no encontrar nada, no devuelve nada.


Stripslashes nos devuelve la cadena de texto introducida sin los caracteres de la barra inclinada \

Devuelve: Esto es un ejemplo.


Stristr nos permite, dado un caracter o cadena de texto, obtener lo que hay detrás o lo que hay delante.

";
  echo stristr($email, '@', true); //Esta función solo funciona de la versión 5.3.0 hacia adelante

?>

Devuelve:
@dominio.com
correo

Explicacion de str_split, str_word_count, strcasecmp, strchr, strstr, strcmp y strcoll

str_split nos permite dada una cadena de texto, obtener una matriz cuyos valores sean cada carácter de la cadena, e incluso poner un límite numérico para que por ejemplo, cada elemento de la matriz contenga N caracteres.

Su sentencia es:

Cadena es la cadena de texto que vamos a dividir en la matriz.
Límite es el número máximo de caracteres que puedo contener cada elemento de la matriz. Es opcional.

Ejemplo

";
?>

Devuelve:

Te
xt
o

Si no estuviera el 2 como parámetro, devolvería:

T
e
x
t
o


str_word_count nos permite contar las palabras que existen en una cadena, separadas por cualquier caracter que no sea una letra. Por ejemplo, en la frase: OLPC tiene 3 años, diria que solo existen 3 palabras, OLPC, tiene, y años. Tambien podriamos hacer la prueba con la frase: OLPC t1ene 3 años, diciendo que tendria 4 palabras, OLPC, t, ene, y años. Es decir, cualquier caracter que no sea una letra, actúa como separador entre palabras, aunque podemos añadir excepciones.

Su sentencia es:

Cadena es la cadena de texto en la cual vamos a contar el número de palabras existentes.
Formato es un número del cero al dos, que nos permite personalizar el resultado. Si ponemos un 0, devuelve el número de palabras (por defecto), si ponemos un 1, devuelve un array cuyos elementos sean las palabras encontradas, y si ponemos un 2, devuelve un array cuyos elementos sean las palabras encontradas y cuyo índice es la posición de la letra de cada palabra.
Lista es la lista de caracteres que queremos excepcionar para que no sean separadores de palabras. Por defecto son todos, salvo las letras mayúsculas y minúsculas (incluyendo la Ñ y las vocales con acentos)

Ejemplo


"; foreach($resultado2 as $clave => $valor) echo "Clave: $clave y Valor: $valor
"; echo "
"; foreach($resultado3 as $clave => $valor) echo "Clave: $clave y Valor: $valor
"; ?>

Nos devuelve:

3

Clave: 0 y Valor: OLPC
Clave: 1 y Valor: tiene
Clave: 2 y Valor: años

Clave: 0 y Valor: OLPC
Clave: 5 y Valor: tiene
Clave: 11 y Valor: 3
Clave: 13 y Valor: años


strcasecmp nos permite comparar el primer caracter de dos cadenas de texto, y obtener la diferencia de posiciones (respecto la tabla ASCII) que hay entre ellas. No distingue entre mayúsculas o minúsculas en el caso de las letras. En caso de que la cadena sea de más de un carácter y el primer carácter sea igual, pasará al segundo carácter (lo veremos más claro con el ejemplo)

Su sentencia es:

Cadena1 y Cadena2 son las cadenas de texto, cuyos primeros caracteres se van a comparar.

Ejemplo

";
$resultado2 = strcasecmp("hola", "Hona");
//Aqui, como h es igual a H, pasa a comprobar el siguiente caracter, y como también es igual, pasa a comprobar el tercero, entre 'l' y 'n'. Podemos observar que hay una diferencia de 2 posiciones entre ambos
echo $resultado2 . "
"; $resultado3 = strcasecmp("=", "-"); echo $resultado3 . "
"; //Ahora, pasaremos los caracteres = y - a ASCII y los restaremos, para ver que nos da el mismo resultado: $otro = ord("=") - ord("-"); echo $otro; ?>

Nos devuelve:

-1
2
16
16


strchr y strstr (usaré strstr para los ejemplos pero funcionan de manera idéntica) nos permiten obtener una cadena de texto posterior o anterior a un separador.

Su sentencia es:

Cadena es la cadena de texto que vamos a dividir.
Separador es la cadena de texto que nos permitirá dividir la otra cadena de texto entrante.
Bool es un valor, que puede ser true o false. Por defecto está en false. Es opcional.
Nota: el último parámetro solo funciona a partir de la versión de PHP 5.3.0

Ejemplo

";

$usuario = strchr($email, '@', true);
echo $usuario;
?>

Nos devuelve:
@ejemplo.com
direccion


strcmp y strcoll funcionan de una manera parecida a strcasecmp. Devuelve 0 si las cadenas son iguales. Devuelve 1 si la el carácter de la segunda es mayor (en la table ascii) que el de la primera cadena, y -1 en caso contrario.

Su sentencia es:

Cadena1 y Cadena2 serán las cadenas cuyos primeros caracteres se compararan. Es sensible a mayúsculas y minúsculas, al contrario que strcasecmp.

Ejemplo

";
$resultado2 = strcmp("z", "a");
echo $resultado2 . "
"; $resultado3 = strcmp("a", "C"); echo $resultado3 . "
"; ?>

Nos devuelve:
-1
1
1

Explicación de matrices en Javascript

Una matriz, no es más que una variable con una o varias dimensiones, en la que podemos almacenar el mismo tipo de datos que en una variable normal y corriente, pero nos permite acceder a contenido de una manera mucho más simple y fácil.

Para declarar una variable lo hacemos del siguiente modo:

Para acceder a su contenido tenemos dos opciones. Por un lado, podemos acceder a el contenido entero de la matriz:

Que nos devuelve: uno,dos,tres,cuatro

O acceder al contenido de cada elemento de la matriz uno a uno:

Que nos devuelve: uno

Para recorrer todos los valores de la matriz es recomendable hacerlo mediante un bucle, como for o while.

¿Qué es lo que podemos hacer con un array? A continuación explicaré los siguientes métodos con ejemplos: concat, join, pop, push, shift, unshift, slice, splice, reverse y sort.

Concat nos sirve para unir en una nueva matriz, los valores de otras matrices.

Devuelve: uno,dos,tres,cuatro,eins,zwei,drei,vier,one,two,three,four

Join nos permite obtener una matriz separada por un separador que nosotros queramos. Recordemos que por defecto salen separadas por comas.

Nos devuelve: uno – dos – tres – cuatro

Pop nos permite eliminar y obtener el último valor de una matriz.

Nos devuelve: cuatro
y: uno,dos,tres

Push nos añade un nuevo elemento a la matriz por detrás, y nos dice cuantos elementos existen (tras añadirlo).

Nos devuelve: 5
y: uno,dos,tres,cuatro,cinco

Shift nos permite eliminar y obtener el primer valor de una matriz.

Nos devuelve: uno
y: dos,tres,cuatro

Unshift nos añade un nuevo elemento a la matriz por delante, y nos dice cuantos elementos existen (tras añadirlo).

Nos devuelve: 5
y: cero,uno,dos,tres,cuatro,cinco

Slice nos permite obtener una matriz cuyos valores sean los de otra matriz, delimitados por un inicio y un fin.

Nos devuelve: dos,tres,cuatro,cinco,seis

Splice nos permite introducir en una matriz valores nuevos, a partir de la posición que queramos, incluso si queremos sobreescribir algunos ya existentes. También se puede usar para borrar los valores existentes entre un rango de índices.

Su sentencia es la siguiente:

Inicio es la posición en donde empezará a añadir o borrar.
Borrados es el número de elementos que se quieren borrar. Si ponemos un 0, solamente añadirá valores.
Valor1, valor2, …, valorN son los valores que deseamos añadir.

Nos devuelve: uno,dos,dos y medio,tres,cuatro,cinco,seis,siete,ocho

Nos devuelve: uno,dos,siete,ocho

Nos devuelve: uno,two,three,four,seis,siete,ocho

Reverse nos permite intercambiar el orden de los elementos de una matriz, de forma que el primero pasa a ser el último, el segundo el antepenúltimo.. etc.

Nos devuelve: cuatro,tres,dos,uno

Sort nos permite ordenar la matriz alfabéticamente.

Nos devuelve: cuatro,dos,tres,uno

Explicación de str_ireplace, str_pad, str_repeat, str_replace, str_rot13 y str_shuffle

str_ireplace nos permite, dada una cadena, encontrar una cadena de texto dentro de ella, y si existe, reemplazarla por otra.

Su sentencia es:

Objeto es el string que queremos encontrar para cambiarlo.
Remplazo es el string sustituto de lo que vamos a cambiar.
Cadena es el string en donde va a buscar.
Nueva es la nueva cadena de texto que se va a formar.

Ejemplo

El resultado será:
Esta es una caDEna DE texto DE ejemplo


str_pad nos permite, dada una cadena, rellenarla con caracteres hasta alcanzar cierta longitud. Podemos elegir por donde queremos rellenarlo (izquierda, derecha, ambos), y también el/los carácter(es) con los que lo vamos a rellenar.

Su sentencia es:

Cadena es la cadena de texto en la que vamos a rellenar.
Longitud es el número de caracteres que queremos tener al final, una vez rellenado.
Caracter es el caracter (o caracteres) con los que vamos a rellenar nuestra cadena. Es opcional, por defecto se rellena con espacios en blanco.
Lugar es por donde se va a rellenar la cadena, izquierda, derecha, o ambos.

Ejemplo

";
echo str_pad("ejemplo2", 13, "=______________=", STR_PAD_LEFT);
//Nota: aquí se nota que va a sobrar. Lo veremos reflejado en el resultado.
echo "
"; echo str_pad("ejemplo3", 20, "-", STR_PAD_BOTH); ?>

Devuelve:

ejemplo1*******
=____ejemplo2
——ejemplo3——


str_repeat nos permite multiplicar una cadena de texto tantas veces como queramos.

Su sentencia es:

Cadena es la cadena de texto que se repetirá.
Veces es el número de veces que se repetirá.

Ejemplo

Nos devuelve:

(*)(*)(*)(*)(*)


str_replace funciona de manera exactamente igual que str_ireplace, aunque a continuación escribiremos un ejemplo si se dieran matrices como cadena.

";
echo $nuevaCadena[1];

?>

Resultando:
Esta es una caDEna DE texto DE ejemplo
Esta es otra caDEna DE texto DEDEDE ejemplo


str_rot13 nos permite cifrar mediante ROT13. Es un tipo de encriptación César (denominado así porque el primero en usar este tipo de encriptación fue Julio César. Se encarga de usar las letras del abecedario que se encuentran en otra posición). Es decir, que nos devuelve caracteres que se encuentran 13 posiciones antes (en el abecedario, sin contar la Ñ). Funciona con mayúsculas y minúsculas, y todo lo que no sean letras, se queda exactamente igual.

Su sentencia es:

Cadena es la cadena de texto que se va a cifrar.

Ejemplo

Nos devuelve:
noPQ12ñ


str_shuffle nos permite desordenar aleatoriamente los caracteres de una cadena.

Su sentencia es:

Cadena es la cadena de texto que se desordenará aleatoriamente.

";
echo str_shuffle("ejemplo");
echo "
"; echo str_shuffle("ejemplo"); ?>

Nos devuelve:
oejmlpe
lojempe
pjemeol

Explicación de preg_grep, preg_quote, preg_replace_callback y preg_split

preg_grep nos permite, a partir de un array, generar otra matriz que tenga los valores del array que coinciden con un patrón.

Su sentencia es:

Patrón es el parámetro expresado mediante expresiones regulares que nos permite encontrar algo definido dentro de, en este caso, una matriz dada.
otraMatriz es la matriz principal en la que tenemos diversos valores y en donde vamos a buscar, mediante el patrón, las coincidencias que queramos.

Ejemplo

 $valor)
echo "Valor: $valor
"; ?>

Nos devuelve:
Valor: Al saludar decimos hola

Si recordemos que en expresiones regulares se distinguen mayúsculas de minúsculas, y para evitar esa distinción ponemos una i al final del patrón, quedando: $patron = ‘/hola/i’;


preg_quote nos devuelve una cadena de texto con los caracteres especiales de las expresiones regulares escapados, por lo que es útil para combinarlo con estas.
Estos caracteres especiales son: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : –

Su sentencia es:

Cadena es la cadena de texto que introducimos.
Caracter es un carácter que introducimos si también queremos escaparlo (es opcional).
Resultado es la cadena de texto de salida, que se encuentra con los caracteres escapados (mediante la barra \)

Ejemplo

Nos devuelve:
Ej\emplo\-nu\evo
Porque escapa el carácter especial por defecto “-” y el que queriamos nosotros, ‘e’.


preg_replace_callback nos permite, al igual que preg_replace, reemplazar datos, pero en este caso, lo podemos realizar a través de funciones, siendo el resultado más personalizable y complejo.

Su sentencia es:

Patrón es la expresión que nos permite encontrar los datos que queremos.
Función es el nombre de la función que utilizaremos.
Input es el valor que introduciremos en la función anterior.

Ejemplo

El objetivo de esta función es añadir 2 días más a la fecha que pone en la cadena. Nos devuelve:
El pasado día 17 hubo una revuelta


preg_split nos permite partir una cadena de texto, dando como resultado una matriz en donde se guarde en cada clave esos valores.

Su sentencia es:

Patrón es el conjunto de expresiones regulares a partir de las cuales, cuando encuentre una coincidencia partirá la expresión, almacenando el resultado en una matriz.
Cadena es la cadena de texto que deseamos partir.
Límite es el número máximo de cadenas que queremos obtener. Este parámetro es opcional. Si se escribe un 0, o no se pone, se entiende que no hay límite.
Opciones nos permite personalizar el resultado de la matriz resultante. Explicaré las 3 opciones más comunes.

Ejemplo

 $valor)
echo "Valor: $valor
"; ?>

Nos devuelve:
Valor: Est
Valor: es un
Valor: c
Valor: den
Valor: de texto de ejemplo.

Podemos observar que cada valor de la matriz, corresponde al trozo de cadena partida (sin el separador).

Ahora explicaré las diferentes opciones que podríamos añadir:
PREG_SPLIT_NO_EMPTY se encarga de que la matriz no tenga ningún elemento vacio. ¿Cómo es posible que tenga elementos vacios la matriz?
Imaginemos que usamos de patrón un punto, y de cadena, una frase terminada en punto:
“Esto es un ejemplo.”
preg_split separa en dos trozos lo que hay antes, y lo que hay detrás del punto. Como detrás del punto no hay nada, se guarda un valor vacio (null).

PREG_SPLIT_DELIM_CAPTURE se encarga de que nuestra matriz venga con los delimitadores como valores nuestra propia matriz (esto solo funciona si se han usado paréntesis en la expresión regular de patrón). Es decir, en nuestro anterior ejemplo nos devolvería lo siguiente:
Valor: Est
Valor: a
Valor: es un
Valor: a
Valor: c
Valor: a
Valor: den
Valor: a
Valor: de texto de ejemplo.

PREG_SPLIT_OFFSET_CAPTURE genera una matriz de dos dimensiones, de manera que, en cada coincidencia nos muestra la posición del primer carácter de la cadena partida. Lo veremos claramente mediante un ejemplo:

 $valor)
echo "Valor: $valor[0] y $valor[1]
"; ?>

Nos devuelve:
Valor: Est y 0
Valor: es un y 4
Valor: c y 11
Valor: den y 14
Valor: de texto de ejemplo. y 18

Repito, el número obtenido es la posición del primer carácter de cada uno, respecto la cadena original.

Explicación de preg_match_all, preg_match y preg_replace

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:

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:

";
echo $salida[1][0] . " y " . $salida[1][1];
echo "
"; echo $salida[2][0] . " y " . $salida[2][1]; ?>

Nos devuelve:

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

El siguiente ejemplo:

";
echo $salida[0][1] . " y " . $salida[1][1];
echo "
"; 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:

Usaremos un ejemplo para explicar su funcionamiento:

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:

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.

Devuelve: Nací el 26 de Enero de 1992

Explicación de las Expresiones Regulares más comunes, con ejemplos

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

Devuelve:
2345678
34567

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

Ejemplo 2

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

Ejemplo 3

';
preg_match_all('/

Nos devuelve:

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

Ejemplo 4

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

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

';
preg_match_all('/(

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 3 Comments on Explicación de las Expresiones Regulares más comunes, con ejemplos/

Bordes redondos en CSS

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)

(In)seguridad en los foros [SMF]

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:

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…)

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)

$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