Haciendo el bloque más seguro...

Haciendo el bloque más seguro...

de David Rozas Domingo -
Número de respuestas: 11
Hola!.

Estoy intentando hacer el bloque más seguro. He estado mirando algunas de las funciones de moodle, y me gustaría saber si las estoy usando correctamente :

-Respecto a sesskey:
En la función get_content de block_"mi_bloque", paso por GET la sesskey llamando a la función sesskey(). Ej.:

$this->content->items[] = '<a href=../blocks/gturnos/registro_alumno.php?course='. $COURSE->id . '&sesskey=' . sesskey(). '>Registrarse</a>';


Después la compruebo "en la página siguiente" con la función confirm_sesskey($sesskey), siendo el parámetro de esta función el pasado por la página anterior. Ej.:
///Comprobamos que sea alumno, y su sesskey
if(isstudent($courseid) && confirm_sesskey($sesskey))
{ ....}

De aquí en adelante repito el mismo proceso, pero sin llamar a sesskey(), sino pasando simplemente la variable anterior de página a página por GET o por POST.
¿Es esta la forma correcta de usar sesskey?

-Respecto a require_login y isteacher() o isstudent():
Además en cada página de registro, configuración, acceso a bd, etc. compruebo siempre lo siguiente :
//Esta función checkea que este logueado, y que tenga permisos para estar en este curso.
//Evitamos que un guest acceda a información que no debería si escribe la url.
require_login($courseid);

//Comprobamos que es profesor, y su sesskey
if (isteacher($courseid) && confirm_sesskey($sesskey))
{ ...

Ya sea para profe o para alumno.
¿Es este la forma de hacerlo correctamente?

Gracias!

Un saludo,
David

Promedio de valoraciones: -
En respuesta a David Rozas Domingo

Re: Haciendo el bloque más seguro...

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
sesskey() se usa para evitar ataques de Cross Site-Scripting
(XSS), así que no entiendo porque si la primera vez lo usas
para 'comprobar' los valores, no lo usas la segunda para
utilizarlos y llevar a cabo la acción real. Si la primera vez
es importante, la segunda lo es aún más (es cuando 'ejecutas'
realmente la acción).

Por cierto, he intentado poner un comentario en tu blog sobre
el tema de get_string, pero me ha sido imposible, así que te
lo comento por aquí.

Las cadenas en español ponlas en es_utf8 (y no es_es_utf8). El
segundo es sólo para los detalles específicos de España
(moneda y cuatro cosillas más) y el primero para el idioma
español. El segundo 'incluye' al primero para todo aquello que
no tenga definido, así que no hay problema. El otro detalle es
que te asegures de que en el fichero es_utf8 esté codificado
en UTF-8 (las eñes tildes y demás) y que el 'es' esté en
ISO-8859-1 (ó -15). De lo contario las tildes eñes y demás se
verán raras.

Saludos. Iñaki.
En respuesta a Iñaki Arenaza

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Hola, Iñaki.

¿Te refieres a si los uso solamente en la página de validación?. No, los uso también en las páginas de confirmación y en la que realiza la acción.
Por ejemplo, para registrar un nuevo rango de turnos el proceso sería :

1.block_gturnos.php (aquí tomo sesskey por la función sesskey, y se pasa por get a registro_bloque.php) ->
2.registro_bloque.php (toma el valor de sesskey con required_param, y hago un confirm_sesskey() de ese valor). Esa variable, pasa a confirmar_registro_bloque.php en un campo hidden del formulario->
3.confirmar_registro_bloque.php (recojo con required param, hago confirm_sesskey(), y la paso por get a guardar_bloque.php) ->
4.guardar_bloque.php(recojo con required param, hago confirm_sesskey(), y si esta ok, se guarda todo en base de datos).

El código en cada una de ellas sería del estilo :
require_login($courseid);
if (isteacher($courseid) && confirm_sesskey($sesskey))
{
-Acciones (validación,confirmación,guardar en bbdd, etc., dependiendo de la página que sea)
}else{
-Redirijo a página del curso
}

¿Es esta la forma de usarlo correctamente?.

Respecto al tema de los idiomas, lo primero que probé es es_utf8; pero no "me las cogía". Acabo de probar renombrando, y ahora me toma las que están en inglés.
Cuando voy a cambiar el idioma de un usuario solo me aparecen las opciones (es_es y en). Supogo que eligiendo es_es y renombrando la carpeta del bloque a es_utf8 debería de cogerlas, pero no lo hace. Lo único que se me ocurre es hacer es_es_utf8, es_utf8 (copia de la anterior), en_utf8, y lo mismo para las codificadas en iso-8859-1.
La verdad, es que no entiendo por que no "lo coge" si la renombro a es_utf8.

Muchas gracias!!!

Un saludo,

David

P.D.: Ya está apañado lo del blog, es que por defecto los comentarios tienen que ser moderados; y como nadie había escrito comentario, ni me había dado cuenta. Pero ya lo he cambiado para que aparezca según lo escriben.
En respuesta a David Rozas Domingo

Re: Haciendo el bloque más seguro...

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
No soy un experto en el uso de sesskey, pero diría que el uso si es correcto.

En cuanto a lo del idioma que te deja elegir, dependerá de los idiomas que se hayan configurado como disponibles en Administración >> Configuración >> Variables. Si sólo has habilitado 'es_es' y 'en', sólo te dejará usar esos. Si activas más (por ejemplo es_utf8) e instalas los ficheros del idioma (y si usas langcache asegurate de ejecutar el cron.php) aparecerá también esos otros.

Saludos. Iñaki.
En respuesta a Iñaki Arenaza

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Ok, gracias Iñaki.
Sí, he probado a agregar el es y lo coge sin problema.
Lo que no entiendo es porque "no engloba", es decir, si tengo escogido es_es y en un bloque hay solo es y en, lo suyo es que cogiera es. Pues me coge en.
De momento he agregado : es,es_es y en (tb para utf8).

Acabo de agregar el proyecto al directorio de plugins, por si te interesa echarle un vistazo.

Un saludo, y gracias por el interés :D !

David
En respuesta a Iñaki Arenaza

Re: Haciendo el bloque más seguro...

de Martín Langhoff -
Hmmm! Aunque elijas solamente es_es, debería buscar cada string en el siguente orden:

- es_es
- es
- en

Siempre con sufijo _utf8, claro. David, estas seguro que estas viendo un bug ahí? Si es así puedes detallar los pasos y reportarlo (ponme al menos en watchers).

PD: Y que si las coge o no las coge... qué tanta pornografía! digo yo que soy es_ar guiño

NOTA: acabo de hacer un par de pruebas y no veo el problema... un una instalación nueva instale es y es_ar, le digo que sólo use es_ar y correctamente lee es también...
En respuesta a Martín Langhoff

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Hola, Martín.

Acabo de volver a probar, y nada. Tengo instalado es_es, es y en. Si elimino (por ejemplo renombro la carpeta) es_es y tengo seleccionado es, me coge ( :D ) primero en.
Tengo instalado Moodle 1.6.2

Aquí dejo unos pantallazos...

#1 Renombro carpetas es_es y es_es_utf8

#2 Un usuario tiene es_es

#3 Muestra en, en lugar de es

#4 Ponemos bien la carpeta es_es y es_es_utf8

#5 Recargo la página anterior... y ahora lo muestra correctamente (muestra es_es_utf8)

No sé que estará pasando...

Un saludo,

David
En respuesta a David Rozas Domingo

Re: Haciendo el bloque más seguro...

de Martín Langhoff -
Lo que describes muestras que Moodle está haciendo lo correcto. En #1 #2 #3

- en_utf8 tiene todos los strings
- es_utf8 debería tener todos los strings (pero si falta uno, caemos en en_utf8)
- es_es_utf8 tiene unos pocos strings específicos de es_es

Si es_es y es desaparecen, Moodle lo único que puede hacer es caer en "en"...

Edit: Y si no puede encontrar es_es, no sabe cual es es parentlanguage. Es decir, el mecanismo no asume automaticamente que tiene que buscar un lang con las 2 primeras letras antes del _, sino que cuenta con poder leer es_es_utf8/moodle.php que contiene un parámetro 'parentlanguage'.
En respuesta a Martín Langhoff

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Hola!.

Sigo sin verlo claro... :D
En #1,#2,#3 he eliminado es_es y es_es_utf8, no es_es y es.

Lo que me gustaría conseguir es tener solo es (+es_utf8, omito utf8 a partir de ahroa) , y que leyeran el mismo los que selecciones es, es_es, es_ar, etc...
Ahora mismo tengo instalados es,es_es y es_ar en moodle. Pues alguien que escoja es_ar, le aparece en, en lugar de es. He probado a quitar es_es, y pasa lo mismo.

Es decir en lugar de hacer :
Usuario es_ar : es_ar ->es->en, hace directamente
Usuario es_ar : es_ar ->en

Lo mismo ocurre con es_es (si no hago una copia es_es del es)

El problema es...¿como conseguir que tanto es, como es_es, es_ar etc. usen sólo es, sin tener que hacer copypaste del fichero es a cada es_es, es_ar, etc?

(Menuda rayada de mensaje ;D )

Un saludo,

David

En respuesta a David Rozas Domingo

Re: Haciendo el bloque más seguro...

de Martín Langhoff -
> Usuario es_ar : es_ar ->es->en, hace directamente
> Usuario es_ar : es_ar ->en

Porque es_ar no existe, entonces no le puede preguntar cual es su 'parentlanguage' entonces cae en el último recurso que tiene: en.

Se entiende? No hay regla mágica que diga que es_ar tiene que heredar de es. Es una configuración explícita adentro de es_ar. Si es_ar no existe... pues ná.

Mira adentro del es_ar o es_es que tienes, en el archivo moodle.php y vas a ver. Para probar, cambia el parentlanguage a, digamos, cz guiño
En respuesta a Martín Langhoff

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Ok, creo que ya lo he entendido.

Entonces, ¿hay alguna forma de replicar el mecanismo para un bloque?.
He creado es_es, es_ar, etc. y he intentado asociarlo a es como se hace por ejemplo en el moodle.php de es_ar asignádole parentlanguage=es, pero sigue cogiendo en.

Es decir...¿como puedo asignar a todos los es_xx que su padre es es, sin tener que copiar todas las strings en cada es_xx?

He estado bajándome bloques y módulos para copiar la forma...pero no he encontrado ninguno que tuviera es_xx, sólo es.

Gracias!




En respuesta a David Rozas Domingo

Re: Haciendo el bloque más seguro...

de David Rozas Domingo -
Estoy probando cosas del estilo :

global $CFG;
$string['parentlanguage'] = $CFG->wwwroot . '/blocks/gturnos/lang/es_utf8/';

o ...

global $CFG;
$ruta_es = $CFG->wwwroot . '/blocks/gturnos/lang/es_utf8/block_gturnos.php';
///echo $ruta_es . '<br>';
require($ruta_es);

dentro del block_gturnos.php en es_ar_utf8 de mi bloque, pero no funciona...