Es habitual que algunas versiones de Internet Explorer den la tabarra al ser un navegador que no sigue los estándares. Tranquilos, don’t worry. Podéis detectar con PHP si el navegador es Explorer y, dependiendo del resultado, mostrar una maquetación u otra. La función es simple:
<?php
$browser = getenv("HTTP_USER_AGENT");
if (preg_match("/MSIE/i", "$browser"))
{
//Lo que toque hacer con el Explorer
}
else
{
//El resto
}
?>
Claro que hay que reconocer que IE9 o IE10 no son tan problemáticos como las versiones anteriores ¿Y si sólo quieres descartar del 8 para abajo? Bueno, toca cambiar un poco el código, para así poder detectar el número de versión (que por suerte está casi extinto, pero todavía arreglo equipos con Internet Explorer 6):
if(preg_match('/(?i)MSIE [5-8]/',$_SERVER['HTTP_USER_AGENT']))
{
//Aquí lo que va a hacer si es menor que 8
}
else
{
//Aquí el resto de navegadores y explorers más nuevos.
}
En fin, si queréis sí permitir el 8 y no el 6 y el 7… bueno, pues cambiáis el rango en la expresión regular del ejemplo, y listo.
Un amigo me ha dejado una Raspberry Pi y ando dando vueltas a experimentos varios. Esta mañana, hablando con un compañero de curso, este me comentó de un proyecto libre para convertir equipos en centros multimedia basado en software de XBOX de Microsoft (XBMC), si bien llegamos a la conclusión de que el pequeño miniordenador educativo tal vez no era lo más idóneo si quieres reproducir películas en HD (ojo, que hay una versión para Raspberry Pi de dicho software). Pero con todo esto del PRISM y el espionaje descarado de la NSA tal vez un servidor de chat pueda interesar a alguien.
La Raspberry Pi del experimento
En este caso vamos a usar Prosody, y vamos a suponer que estáis usando la versión adaptada de Debian para la Raspberry Pi. Lo primero, como no, instalar Prosody:
sudo apt-get install prosody
Ok, ya está instalado. Con esto, el archivo de configuración básico y un par de usuarios creados ya podrías operar, pero vamos a configurar un poco la historia. Lo primero vamos a meter las librerías para encriptación, compresión y soporte de base de datos:
sudo apt-get install luasec lua-zlib luadbi
Con esto ya tenemos las librerías necesarias. Ahora toca irse al archivo de configuración y activar ciertos módulos. Dichos módulos, por defecto, vienen desactivados ya que las líneas en el archivo de configuración están comentadas con dos guiones al principio de la línea. Para descomentarlas simplemente borra esos guiones.
Para entrar a editar el archivo de configuración:
sudo gedit /etc/prosody/prosody.cfg.lua
Allí elegís ya los módulos a activar. Yo en el mío he activado estos:
"privacy"; -- Support privacy lists
"compression"; -- Stream compression
"groups"; --Shared roster support
"roster"; -- Allow users to have a roster. Recommended
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"disco"; -- Service discovery
"private"; -- Private XML storage (for room bookmarks, etc.)
"vcard"; -- Allow users to set vCards
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"adhoc"; -- Support for "ad-hoc commands" that can be executed with an XMPP client
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
Vosotros configurad como queráis. Ahora sí que vamos con un punto importante: ¿queremos que la gente pueda registrarse o queremos sólo poder crear usuarios nosotros para tener un mayor control del acceso? Ya que hablamos de seguridad y privacidad es un punto importante. Por defecto el módulo de registro y la opción de permitir el registro están desactivados, así que si queremos activarlo toca descomentar el módulo «register» y la línea que pone allow_registration=true. Es de suponer que no tendréis una ip fija, al menos en España lo normal es tenerla dinámica y la fija implica un sobrecargo en la factura, por lo que será cosa buena haceros con un dominio (podéis conseguir uno gratis en noip.com). Luego buscáis en la configuracion una línea que pone VirtualHost «example.com» y la cambiáis por vuestro dominio. Debajo habrá una línea que pone enabled = false, la comentáis o borráis y estará activado vuestro dominio.
Bueno, con esto ya tendrías el servidor de chat furrulando cosa buena. Pero como no queremos que un pajillero del FBI lea lo que escribimos casi mejor vamos a encriptar, que para algo metimos antes el módulo (aunque si leemos entre líneas la declaración de Snowden, es probable que la NSA ya sea capaz de romper la seguridad SSL). En todo caso lo primero es irnos a la carpeta de certificados de Prosody y desde allí trabajar:
Tras esto te pedirá una serie de datos que, excepto uno, no son muy relevantes. La excepción es Common Name (e.g. server FQDN or YOUR name) []:, donde tenéis que poner el nombre de dominio conseguido antes, el resto si queréis los podéis ignorar. Una vez acabado este proceso se crearán dos archivos: prosody.cert y prosody.key. Con ellos creados os toca volver a abrir para editar el archivo de configuración principal.
La primera vez lo ponéis sobre las rutas ssl por defecto y ponéis exactamente lo mismo justo debajo de la línea de VirtualHost «elnombrededominioquetengáis».
Yo no me voy a meter a configurar base de datos, aunque instalara antes la librería, porque en una Raspeberry Pi no es que vayamos sobrados de recursos. Si queréis hacerlo tenéis un excelente tutorial en español aquí(fue uno de los varios que utilicé como documentación mientras hacía las pruebas).
Bueno, una vez acabado esto ya sólo nos queda lanzar Prosody:
sudo /etc/init.d/prosody start
Podéis modificar el sistema para que arranque al a vez que el sistema operativo, si lo véis necesario. Ahora con cualquier cliente de XMPP o Jabber, como Pidgin, podéis acceder a él. Cuando entréis por primera vez os pedirá que creéis una cuenta en el servidor. Bueno, si habéis habilitado el registro de usuarios bien, ¿y si no? Ya lo comentamos arriba, puedes no permitir el registro y crear tú los usuarios, si quieres un servidor de chat para un pequeño grupo de trabajo/amigos no es mala idea. Bueno, los usuarios se crean con la sintaxissudo prosodyctl adduser nombredeusuario@eldominioquepillaras. Por ejemplo, supongamos que tu dominio es fucknsa.cc y el usuario que quieres crear se va a llamar, no sé, un nombre aleatorio, por ejemplo assange:
sudo prosodyctl adduser assange@fucknsa.cc
Por cierto, que si quieres montar el servidor de chat en una red local no necesitarás el dominio.
Bueno, ya tienes tu cacharrito con servidor de chat. A divertirse tocan.
Hoy se cumplen 123 años, que es un número curioso, del nacimiento de HP Lovecraft, maestro del terror, renovador del género y uno de mis autores favoritos. Mucho se ha escrito sobre él, sobre si era un mediocre o un genio, era un fascista o estaba traumatizado o si era asexual o veía sexo en todas partes. Dejando al lado esos temas, que hay muchos estudiosos de su obra, sólo adjuntaré un poema, uno de los framentos de Hongos de Yuggoth llamado Vientos Estelares, como homenaje a su obra:
It is a certain hour of twilight glooms,
Mostly in autumn, when the star-wind pours
Down hilltop streets, deserted out-of-doors,
But shewing early lamplight from snug rooms.
The dead leaves rush in strange, fantastic twists,
And chimney-smoke whirls round with alien grace,
Heeding geometries of outer space,
While Fomalhaut peers in through southward mists.
This is the hour when moonstruck poets know
What fungi sprout in Yuggoth, and what scents
And tints of flowers fill Nithon’s continents,
Such as in no poor earthly garden blow.
Yet for each dream these winds to us convey,
A dozen more of ours they sweep away!
Y ahí queda, y es que no está muerto aquel que yace eternamente. E incluso tras muchos eones hasta la muerte puede morir.
Existen dos formas de usar el acortador de URL Bit.ly en WordPress. ¿Por qué usar Bit.ly para acortar url’s y no usar, por ejemplo, perce.be? Bueno, depende del uso que le queráis dar, claro. Un site como perce.be os permite acortar la URL, cumple su función. Pero Bit.ly además de permitirnos acortar un link también nos dará estadísticas sobre cuántas veces se ha hecho click, desde donde… en fin, tiene un completo sistema de estadísticas. (Si no queréis generarlas entonces os será más cómodo un servicio más directo, como perce.be).
Bueno, ya os he comentado que hay dos formas de usar Bit.ly en WP. La primera y la más sencilla es instalar un plugin para Bit.ly, de los que ya hay varios disponibles, pero el más recomendable es WP-bitly, ya que otros de las más populares llevan tiempo sin actualizaciones.
Pero si no quieres depdender de un plugin externo siempre puedes meterle mano al código (recordad que hablamos de instalaciones de WordPress en vuestros propios servidores, no de los WP gratuitos de wordpress.com, como este). Lo primero es que os hagáis una cuenta para acceder al API de Bit.ly, y tras esto le metéis mano a functions.php:
function bitly()
{
//información del login
$url = get_permalink(); //genera el permalink de wordpress
$login = 'tulogin'; //aquí mete tu nombre de usuario de Bit.ly
$apikey = 'R_churro_de_letras_y_números'; //tu API key de Bit.ly
$format = 'json'; //puedes elegir json o xml, en este caso json
$version = '2.0.1';
//creando la url
$bitly = 'http://api.bit.ly/shorten?version='.$version.'&longUrl='.urlencode($url).'&login='.$login.'&apiKey='.$apikey.'&format='.$format;
//obtener la url
//también podría usarse cURL
$response = file_get_contents($bitly);
//ahora toca parsear según el formato
//vamos a usar las dos posibilidades aunque arriba haya elegido json
if(strtolower($format) == 'json')
{
$json = @json_decode($response,true); //descodificamos el json
echo $json['results'][$url]['shortUrl']; //imprimimos datos
}
else //xml
{
$xml = simplexml_load_string($response); //cargamos el xml
echo 'http://bit.ly/'.$xml->results->nodeKeyVal->hash; //imprimimos lo buscado
}
}
Y con esto tenemos ya la función. Ahora nos queda añadirla a nuestro código. En single.php, debajo de la llamada a the_content() es el lugar ideal para meter tu llamada a bitly(). Y listo, ya estás generando tu url acortada con Bit.ly.
A veces, cuando montas un Wodpress para un cliente, no te interesa que este pueda cambiar el theme. No es por limitar la libertad del cliente, es por el riesgo de que trasteando lo cambie, luego no sea capaz de volver a ponerlo y tengas que ir a hacer mantenimiento (que siempre le puedes cobrar, pero si te está pagando una tarifa fijo por mantenimiento, que es lo normal, eso acaba en «más trabajo por el mismo precio«). Tranquilo, basta con añadir unas pocas líneas afunctions.phpy evitaremos que esto ocurra, bloqueando la posibilidad de cambiar el theme del usuario.
add_action('admin_init', 'que_cambie_el_theme_tu_abuela');
function que_cambie_el_theme_tu_abuela() {
global $submenu, $userdata;
get_currentuserinfo();
if ($userdata->ID != 1) {
unset($submenu['themes.php'][5]);
unset($submenu['themes.php'][15]);
}
}
Y point ball (oseáse, punto pelota). Bueno, mejor no le llaméis «que_cambie_el_theme_tu_abuela» a la función, por cosas de profesionalidad, ponedle algo como «bloquear_cambio_theme«, «bloquear_theme«, etc.
Como sabéis todos los que tenéis un blog, los trackbacks son un sistema que os avisa cuando un bloguero ha hecho una referencia a uno de vuestros artículos en el suyo. Pero claro, si tú haces una referencia a uno de tus propios artículos en otro (tipo «Como ya comenté en el artículo X…») el trackback también se envía. Como generalmente no queremos comentarios de nuestros propios trackbacks en nuestros artículos os voy a enseñar un pequeño fragmento de código que, añadido a functions.php deshabilitará el auto-trackback:
function deshabilitar_autoping(&$links){
foreach ($links as $l=>$link){
if(0===strpos($link, get_option('home')))
unset($links[$l]);
}
}
add_action('pre_ping'; 'deshabilitar_autoping');
Una simple función que os ahorrará tener que estar borrando cada dos por tres vuestros propios trackbacks.
En fin, ya que ando empantanado preparando temario para dar clases de LibreOffice y, a la vez, recibiendo clases de Microsoft Office creo que os van a tocar varias entradas sobre el tema en este blog.
Hoy vamos a hablar sobre las funciones lógicas en LibreOffice Calc, la hoja de cálculo de LibreOffice. Si estáis acostumbrados a Microsoft Office… son prácticamente iguales.
¿Qué son las funciones lógicas? Son funciones que trabajan con valores booleanos, es decir: verdadero o falso. En las hojas de cálculo nos permiten crear condicionales más o menos complejos. Primero vamos con la teoría «gorda» y luego en un par de ejemplos os queda más claro. Como os podéis imaginar la potencia de estas funciones no es pasarles a mano un valor VERDADERO o FALSO sino una expresión que pueda devolver ese valor (generalmente mediante una comparación).
En LibreOffice Calc tenemos las siguientes: Y, FALSO, SI, SIERROR, SIND, NO, O, VERDADERO y XOR. Vamos a verlas una por una:
Funciones de Calc (en gallego)
Y: Su sintaxis sería Y(valorLógico1; valorLógico2… valorLógico30). Esta función devuelve VERDADERO si todos sus argumentos son verdaderos, en caso de que alguno no lo sea devolverá FALSO. Requiere como mínimo un valor y hasta un máximo de 30.
FALSO: Esta función no evalúa ni recibe ningún parámetro, simplemente devuelve un valor FALSO.
SI: Esta función requiere tres parámetros que son una prueba lógica, un valor a devolver si se cumple y un valor a devolver si no, aunque sólo es obligatoria la prueba lógica. Más abajo os explicaré como anidar varios. La sintaxis básica es SI(prueba lógica; valor si se cumple; valor si no).
SI.ERROR: Esta función recibe dos valores y devuelve el primero si es válido. Pero si este devuelve un error entonces devuelve el segundo. La sintaxis es SIERROR(valor; valor alternativo).
SI.ND: Similar a la anterior, en este caso devuelve el valor sacando que sea #ND, en ese caso devuelve el segundo valor.
NO: Devuelve lo contrario al valor que recibe. Es decir, si recibe un VERDADERO devuelve FALSO y viceversa (vamos, que «niega» o complementa lo que tiene dentro).
O:Similar a Y en sintaxis, que es O(valorLógico1;valorLógico2… valorLógico30). En este caso la función devuelve VERDADERO si alguno de sus valores es verdadero.
VERDADERO: Como en el caso de FALSO, no recibe ni evalúa nada y, en este caso, devuelve VERDADERO.
XOR: El más complejo de explicar, se trata de una puerta lógica OR exclusiva (de ahí XOR). Dicho así acojona, pero es más facil de lo que parece. La sintaxis es como en el caso de Y y O, vamos XOR(valorLógico1; valorLógico2… valorLógico30) y el caso es que devuelve VERDADERO si un número impar de los valores que se le han proporcionado son VERDADEROS.
Ahora tomemos un conjunto de datos aleatorios:
Manolo 30 años Madrid
Pedro 60 años Barcelona
Juanki 45 años Zaragoza
Toño 18 años Buenos Aires
Derrick 23 años La Habana
Juampi 36 años Cedeira
Macael 22 años Medellín
Ok, supongamos que los tienes esto en una tabla, empezando en A2, como la de la foto.
La tabla de ejemplo
Ahora imagina que después hay un campo donde quieres meter un dato, en este caso vamos a decir que un porcentaje que tienen que pagar. Pero hay condiciones: Los que sean de Cedeira y tengan menos de 40 años (ambas) tendrán que pagar 100$; los que sean de La Habana o tengan 45 años o más (una de las dos) pagarán sólo 75$. El resto pagarán 120$. ¿Cual sería la fórmula? Bueno, pues sería la que puedes ver en la imagen (supongamos que me he situado para escribir la fórmula en la primera fila de datos, lo que sería justo a la derecha de Barcelona, con la idea de hacer la fórmula, calcular y arrastrar hacia abajo para que se aplique al resto):
Como tengo el LibreOffice en gallego igual te despista así que te traduzco la fórmula:
=SI(Y(C2=»Cedeira»;B2<40);100;SI(O(C2=»La Habana»;B2>=45);75;120))
Explicación de la fórmula: Abrimos un SI y como prueba lógica le decimos que compruebe las dos primeras condiciones (ser de Cedeira y menor de 40) que por tener que cumplirse ambas van dentro de un Y. En caso de que sea correcto devuelve 100, en caso de de que no anidamos otro SI, que en este caso comienza comprobando que se de alguna (por eso usamos el O) de las otras condiciones, que son ser de La Habana o tener 45 años o más. En caso de que se cumpla devolverá 75 y en caso de que no, es decir que el registro no ha cumplido ni las condiciones del primer chequeo ni las del segundo, en ese caso devuelve 120. Ves, no era tan difícil, todo es ir pensando cómo hay que anidar las cuestiones. El resultado sería este:
Resultados
Y en el caso del XOR, como os decía antes, tenéis que pensar que sólo devuelve verdadero si el número de elementos que recibe que dan verdadero son impares. Pensad en aquellas tablas de lógica aristotélica del instituto: En un XORVERDADERO+FALSO=VERDADERO, FALSO+FALSO=FALSO, FALSO+VERDADERO=VERDADERO, VERDADERO+VERDADERO=FALSO. Parece coñazo pero es simple.
En fin, os dejo con esto. En el futuro más funciones.
Tras muchas entradas consecutivas de informática vuelve la sección Joyas Musicales, que muchos esperáis con ansia. Esta vez la entrada es un poco más cañera de lo habitual en la sección, con una banda de la oleada tardía del thrash de la Bay Area.
Los californianos Forbidden suelen ser recordados por ser la banda en la que empezó Rob Fynn de Machine Head (en este disco debut no toca, pero todavía hay tres temas que llevan su firma) y por ser también el «grupo madre» de Paul Bostaph, quien se encargaría posteriormente de los tambores en Slayer, Testament o Exodus. Y con Testament tiene mucho que ver el sonido de esta banda, que practica un thrash metal agresivo, no tan melódico como el de los primeros Metallica o Megadeth, sino más cercano a Testament e incluso a los primeros trabajos de Exodus. No les emparento con Slayer por la voz de Russ Anderson, más heavy y aguda, mucho más melódico que Araya. Forbidden Evil fue su primer disco, y seguramente el más conocido.
No es que Forbidden tuvieran una carrera espectacular, pero este disco siempre me ha parecido uno de los trabajos más finos del thrash americano de los 80. Se abre de manera fantástica con el cañonazo Chalice of Blood, una bala entre las cejas que pone a prueba tus cervicales y que invita al moshpit. La sigue Off the Edge con una intro de bajo que nos lleva hacia una sucesión de riffs más densos y oscuros para acabar derivando en un tema más épico, muy Overkill. Through Eyes of Glass en cambio juega con un tono más speed metal, con unos riffs que bien podrían haber formado parte del Painkiller de los Judas. De nuevo la épica se mezcla con la suciedad en Forbidden Evil, otro tema cercano al sonido Overkill. En March Into Fire un agresivo ritmo de batería nos lleva a una becerrada poguera moshpit sin descanso que te hará vomitar los higadillos y desenroscar la cabeza moviéndote como una maníaco. Más en la onda de Testament o Anthrax llega Feel The Pain, que da paso a un As good as death muy en esa onda. Cierra el disco Follow me, tema que comienza con un punteo limpio para evolucionar en un largo tema de speed thrash épico donde los agudos de Russ casi parecen querer emular a King Diamond (que seguro que ejerció gran magisterio en los inicios del vocalista).
No es un disco especialmente variado ni muy bien producido, pero sí una buena demostración de thrash metal en su más pura esencia, ofreciendo tralla a mansalva, guitarras vomitando solos de miles de notas y riffs cortantes como cuchillas. Un must hear para todos los amantes del thrash metal de la vieja escuela.
En el mundo de la web móvil la etiqueta meta viewport se ha convertido en un elemento esencial, básico en los últimos tiempos. Inicialmente introducida por Apple en su navegador Safari para iPhone, rápidamente fue adoptada por otros navegadores hasta hacerse habitual en todos los OS móviles. Esta etiqueta busca dar una serie de directrices a los navegadores para que rendericen adecuadamente la web.
Hay que ponerse un poco en situación: cuando aparecieron los primeros smartphones no había webs adaptadas para dispositivos móviles, y pasó tiempo hasta que las hubo (a día de hoy todavía hay muchas páginas que no se visualizan correctamente). ¿Solución? Que el teléfono «emule» una pantalla más grande y la web original se redimensione a ese tamaño. La idea es buena ¿El problema? Bueno, que era una solución temporal para aquel momento, pero que en la actualidad se queda coja. Este sistema que nos muestra una pantalla reducida hace que si hemos hecho una maquetación responsiva con media queries la cosa no acabe de funcionar. Para eso está meta viewport, para establecer el ancho, el alto o el zoom de la página.
La meta viewport utiliza una serie de pares de claves=valores para definir diversos comportamientos del navegador a la hora de renderizar la web:
<meta name="viewport" content="
width = [tamaño en pixels | device-width ],
height = [tamaño en pixels | device-height],
initial-scale = float mayor que 0.1,
minimum-scale = float mayor que 0.1,
maximum-scale = float mayor que 0.1,
user-scalable = [yes | no]
">
<!--Un ejemplillo real tras la teoría-->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
Muy bien ¿y para qué vale cada una?:
Bueno, width lógicamente para definir el ancho de la pantalla. Podéis definir un ancho fijo, lo cual en términos generales viene a ser un epic fail. En cambio si usáis device-width esta ya se adaptará directamente al dispositivo.
Sobre heigth lo mismo, sólo que en este caso se define el alto. En la práctica no se me ocurre quién querría definir un alto estático, pero existir existe.
Para regular qué zoom tendrá por defecto la página está initial-scale, a la cual le tienes que dar un valor a partir de 0.1, siendo el valor 1 el equivalente a no tener zoom (es decir, menos de uno reduce y más de 1 amplía).
La pareja maximum-scale y minimum-scale nos permiten definir cual será el zoom máximo y el mínimo que pueda aplicar el usuario. Como arriba, 1 es igual a que se vea tal cual, sin zoom.
Finalmente user-scalable lo que nos permite es definir si queremos que el usario pueda hacer zoom o no. Lo mejor es dejarlo en yes, ya que no es buena idea poner limitaciones al user, y mucho menos en el caso del zoom, ya que podría tratarse de alguien con problemas de visión que necesite ampliar la página para poder leerla. Con el maximum y el minimum scale tres cuartos de lo mismo, piensa bien qué hace si vas a poner límites.
En fin, con esto ya tienes otro paso para mejorar tus diseños web adaptados a dispositivos móviles.
Uno de los problemas de los algoritmos criptográficos, como le explicaba el otro día a mi madre, es que al ser susceptibles de poder ser rotos por fuerza bruta cada X tiempo tienen que renovarse, dado que la mayor capacidad de procesamiento de los equipos (y más con la posibilidad de hacer computación distribuida) los hace vulnerables con el paso de los años. Decía un profesor mío, y un gran profesor por cierto, «por fuerza bruta todo se rompe, sólo hace falta tiempo«.
La hasta ahora última versión de PHP nos ofrece nuevas funciones a la hora de trabajar con hashes de passwords. Antes era tradicional utilizar funciones como md5(), sha1(), crypt() o hash(). El problema de usar md5() o sha1()es que usan algoritmos muy directos y ligeros. Es decir, que hacen la encriptación y resumen muy rápido, lo cual aunque beneficia el rendimiento en caso de un ataque (lo más habitual con md5() es el llamado «ataque de cumpleaños» que en lugar de intentar encontrar tu contraseña intenta encontrar simplemente una que de el mismo resultado como resumen) facilita la labor del atacante. En cambio hash() y crypt() son algoritmos más complejos, más lentos, tardan más en devolver el resultado. Algo que para el usuario es un imperceptible segundo de espera, pero que en caso de un ataque que tiene que probar millones de combinaciones se convierte en un poderoso impedimento.
En todo caso PHP 5.5 nos provee de nuevas funciones para trabajar con hashes de passwords:
password_get_info
password_hash
password_needs_rehash
password_verify
Las más importantes, en el uso normal que podemos hacer de estas funciones son la segunda y la cuarta. Empecemos entonces por password_hash():
Como su nombre indica, la función genera un hash de tu contraseña. Lógicamente tiene que recibir dicha contraseña como primer parámetro. Como segundo debe recibir una constante con el algoritmo a usar (las opciones son PASSWORD_DEFAULT, que es el que usa por defecto PHP, y PASSWORD_BCRYPT, que nos permite definir varias opciones), y si eliges PASSWORD_BCRYPT puedes pasarle como tercer parámetro una serie de opciones. Las más habituales son cost, que es el «coste de computación» o «número de vueltas» que dará el algoritmo y cuanto más alto sea este número menos rendimiento y más seguridad, y salt, que nos permite «salar» el password (añadirle una cadena para hacer más complejo el asalto a la contraseñas). Un ejemplo con las dos opciones, sacado de la web de php.net
Como podéis ver se hacen dos hashes. El primero con los parámetros por defecto y el segundo usando PASSWORD_BCRYPT con un menor coste para el sistema (el cost en el algoritmo por defecto sería 10) pero con un salt definido. Por lo que he leído el algoritmo por defecto siempre mete un salt aunque no lo definas e incluso se recomienda que mejor dejar a PHP hacerlo antes que meter una cadena estática.
En el caso de password_verify() la cosa es más facililla. La función recibe la contraseña en texto plano y el hash, encriptado con la función password_hash(). Si conciden nos devuelve TRUE y si no coinciden nos devuelve FALSE.
De nuevo me remito al ejemplo del php.net para esto:
<?php
// Ver el ejemplo de password_hash() arriba para ver de dónde viene este hash.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo '¡La contraseña es válida!';
} else {
echo 'La contraseña no es válida.';
}
?>
Con estas dos funciones podéis hacer de manera muy simple un sistema de login en PHP, con apoyo de una base de datos.