Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.
Mostrando entradas con la etiqueta php. Mostrar todas las entradas
Mostrando entradas con la etiqueta php. Mostrar todas las entradas

martes, 18 de mayo de 2010

Inserción de vídeos en WordPress MU

Hace unos días estuve haciendo unas pruebas para migrar Lobosoft a un sistema WordPress MU (la versión multiblog de WordPress que, además, fue con la que comencé la andadura de Lobosoft en un principio para pasar con posterioridad a la que utilizo ahora). Finalmente no me será necesario usarla, pero durante el proceso de configuración de la misma tuve que recordar viejos conocimientos además de ampliar la configuración de WordPress MU para permitir la inclusión del código HTML necesario para que la importación de las entradas que incluyen algún vídeo finalizase con éxito. De no hacerlo así, WordPress limpiaba literalmente el HTML de la entrada eliminando cualquier posibilidad de incluir vídeos de servicios como YouTube o Google Vídeo, por ejemplo.


WordPress lleva a cabo un análisis del HTML que incluimos en una determinada entrada a través de la variable $allowedposttags, un array incluido en el archivo kses.php dentro de del directorio wp-includes de nuestra instalación de WordPress (o WordPress MU, como es el caso del ejemplo). Dicho array contiene, como su nombre indica, las etiquetas HTML permitidas dentro de las entradas del blog. El formato de dicho array (que, a su vez, contiene a otros) es “nombre de etiqueta” => valor, siendo el valor un array sin contenido cuando la etiqueta es un atributo HTML y un array con valores cuando se trata de una etiqueta HTML con atributos. En resumen, se forma una colección de estructuras arbóreas que representan la estructura de un tag HTML. A buen seguro con un ejemplo queda todo más claro. Veamos cómo es definida en $allowedposttags la etiqueta del enlace (anchor):


[php]
'a' => array(
'class' => array (),
'href' => array (),
'id' => array (),
'title' => array (),
'rel' => array (),
'rev' => array (),
'name' => array (),
'target' => array()
)
[/php]


Resulta sencillo ver aquí la estructura de la etiqueta para un link, así como comprobar que no se permite el uso de mapas de imágenes en las entradas de WordPress (a menos que nosotros nos encarguemos de extender el array, por supuesto).


Así, para permitir la inclusión de vídeos en las entradas simplemente tenemos que ampliar el array principal definido para la variable $allowedposttags con el código siguiente:


[php]
'embed' => array (
'id' => array (),
'type' => array (),
'style' => array (),
'height' => array (),
'width' => array (),
'wmode' => array (),
'src' => array (),
'object' => array (
'height' => array (),
'width' => array ()
),
'param' => array (
'name' => array (),
'value' => array ()
),
)
[/php]


Sencillo, ¿verdad?

miércoles, 30 de julio de 2008

Actualizando los plugins de Wordpress

El otro día hablaba sobre la migración del blog entre diferentes versiones de Wordpress, y el problema que había tenido a la hora de importar las entradas (por la función set_time_limit() y ejecutar PHP en modo seguro). Aunque ya pude resolver el problema, en un principio ignorando los errores para importar todas las entradas, y posteriormente mediante el acceso a la configuración del servidor que me proporcionó el proveedor de hosting, no terminó aquí la cosa. Si deseaba actualizar los plugins que estaba usando, podía optar por hacerlo manualmente (descargando la nueva versión del plugin y reemplazando la antigua por esta mediante FTP, procediendo a continuación a configurarlo nuevamente si era preciso), o bien mediante el instalador automático que incorpora Wordpress a tal efecto. Sin embargo, al intentar hacerlo así obtenía un error de permisos:



Downloading update from http://downloads.wordpress.org/plugin/akismet.zip
Unpacking the update
Could not create directory: /xxxxx/yyyyy/wp-content/upgrade/akismet/akismet/
Installation Failed

Sin embargo, esto me extrañó, ya que el usuario asociado a Wordpress tiene los suficientes permisos para subir archivos y crear directorios en el servidor. Investigando un poco, me encontré con un error reconocido para la función mkdir() de las versiones 5.2.3 y 5.2.4 de PHP: no permite crear directorios en modo seguro si la ruta del directorio a crear termina en una barra (slash, "/"). Me dije que no podía deberse a esto... pero sí. Si abrimos el archivo class-wp-filesystem-direct.php (dentro del directorio wp-admin/includes de Wordpress) nos encontraremos con una función mkdir con la siguiente definición:



function mkdir($path,$chmod=false,$chown=false,$chgrp=false)

Esta función mkdir crea un directorio en la ruta especificada dependiendo de los permisos del usuario y grupo que esté intentando llevar a cabo dicha operación. Si al principio del cuerpo de la función comprobamos si estamos en modo seguro, y si es así eliminamos el último carácter de la ruta, si ésta termina en barra...



[php]if(substr($path, -1) == '/' && ini_get('safe_mode')) $path = substr($path, 0, -1);[/php]

Hecho esto, probé a actualizar los plugins y funcionaba correctamente, sin necesidad de desactivar en ningún momento el modo seguro en el servidor.

domingo, 27 de julio de 2008

Control básico de acceso en PHP

Un amigo me preguntaba ayer cómo incluir un control de validación en un sitio web de una forma muy sencilla. Deseaba restringir el acceso a determinados usuarios a la descarga de un determinado recurso. Aunque evidentemente no se trata de la mejor forma de proteger una determinada información, ya que el servidor soportaba PHP, y sin necesidad de montar una base de datos, una posible solución podía ser usar la tupla de variables de servidor $PHP_AUTH_USER, $PHP_AUTH_PW para controlar el acceso, a través de un array de parejas nombre_de_usuario/contraseña. La implementación es muy sencilla, y aunque como ya apuntaba no es la mejor a la hora de proteger nuestra información, puede servirnos para salir del apuro y proteger una información determinada sin necesidad de tocar, por ejemplo, los archivos .htaccess y .htpasswd, por ejemplo, o de montar una infraestructura mayor con el mismo fin.


A continuación dejo el código en PHP. Bastaría, por ejemplo, con usarlo como un archivo index.php, incluirlo en la ruta que deseemos proteger, e incluir al final del código (tras el tag de cierre de PHP, ?>) el código HTML que deseemos mostrar en caso de que el usuario de autentique correctamente (por ejemplo, una página con el enlace al recurso que deseemos mostrar).


[php]
<?php

// Introducir aquí los usuarios que deseemos que tengan acceso al recurso
$lista[0]['usuario']='pepe';
$lista[0]['password']='cables';

$lista[1]['usuario']='juanito';
$lista[1]['password']='piscinas';

//...

function autenticar($u,$p)
{
global $lista;

foreach ($lista as $datos)
{
if ( ($datos['usuario'] == $u) AND ($datos['password'] == $p) )
{
return TRUE;
}
}
return FALSE;

}
// $PHP_AUTH_USER, $PHP_AUTH_PW
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];

if ( !autenticar($user,$pass) )
{
header('WWW-Authenticate: Basic realm="Acceso restringido."');
header('HTTP/1.0 401 Unauthorized');
echo 'Autentifación No Válida';
exit;
}


?>
[/php]