Proyecto de Fin de Carrera
Proyecto de Fin de Carrera
Proyecto de Fin de Carrera
Ingeniera de Telecomunicacin
Contenido
CONTENIDO
Captulo 1..................................................................................................................... 1
Introduccin ................................................................................................................. 1
1.
Antecedentes........................................................................................................ 1
2.
3.
Captulo 2..................................................................................................................... 9
Fundamentos de seguridad en la web .......................................................................... 9
1.
Introduccin. ........................................................................................................ 9
2.
Nociones y terminologa.................................................................................... 10
2.1.
Introduccin al lenguaje de redes y TCP/IP. ............................................. 10
2.2.
Nociones de seguridad. .............................................................................. 12
2.2.1.
Clasificacin de los ataques............................................................... 12
2.2.2.
Fases de un ataque. ............................................................................ 14
2.2.3.
Niveles de seguridad.......................................................................... 16
2.2.4.
La poltica de seguridad..................................................................... 17
2.2.5.
Adquisicin de informacin............................................................... 18
2.2.6.
Tcnicas de explotacin ms comunes: los buffer overflow.......... 21
2.2.7.
Contramedidas de seguridad.............................................................. 25
iii
Contenido
3.
4.
Nmap.......................................................................................................... 53
Proxomitron. .............................................................................................. 54
Tcpdump. ................................................................................................... 55
CommView................................................................................................ 56
Retina. ........................................................................................................ 58
Captulo 3................................................................................................................... 59
Anlisis de seguridad de un sitio web real................................................................. 59
1.
Introduccin. ...................................................................................................... 59
2.
Escenario............................................................................................................ 59
3.
iv
Contenido
3.2.
Anlisis de seguridad de la Aplicacin propiamente dicha. ...................... 68
3.2.1.
Vulnerabilidades encontradas. ........................................................... 69
3.2.2.
Detalle de vulnerabilidades, soluciones propuestas y recomendac. .. 69
3.2.2.1.
Validacin de entrada de usuario insuficiente. .............................. 69
3.2.2.2.
Susceptibilidad a ataques de inyeccin SQL. ................................ 71
3.2.2.3.
Contraseas de alumnos dbiles en el servicio de encuesta....... 72
3.2.2.4.
Revelacin de informacin sensible a travs de ficheros.. ............ 73
3.2.2.5.
Posible inyeccin de etiquetas HTML y JavaScript. ..................... 74
3.2.2.6.
Falsa sensacin de seguridad en la herramienta de admin............. 75
3.2.3.
Conclusiones...................................................................................... 76
3.3.
Anlisis de seguridad de los servidores web. ............................................ 77
3.3.1.
Vulnerabilidades encontradas en apache........................................ 78
3.3.2.
Detalle de vulnerabilidades, soluciones propuestas y recomendac. .. 79
3.3.2.1.
Versiones de software servidor Apache y PHP anticuadas. .......... 79
3.3.2.2.
Servicio SSH anticuado. ................................................................ 79
3.3.2.3.
Apache permite listar directorios web sin index. ....................... 79
3.3.2.4.
Servicios innecesarios en apache. .............................................. 81
3.3.3.
Conclusiones...................................................................................... 82
4.
Conclusiones...................................................................................................... 83
Captulo 4................................................................................................................... 84
Soluciones y mejoras implementadas ........................................................................ 84
1.
Introduccin. ...................................................................................................... 84
2.
Objetivos............................................................................................................ 85
3.
Implementaciones. ............................................................................................. 86
3.1.
Poltica de seguridad en bases de datos y servidor MySQL. ..................... 86
3.1.1.
Justificacin. ...................................................................................... 86
3.1.2.
Modelo propuesto. ............................................................................. 86
3.1.3.
Implementacin. ................................................................................ 88
3.1.4.
Mejoras conseguidas.......................................................................... 89
3.2.
Sistema de usuarios y autentificacin........................................................ 89
3.2.1.
Justificacin. ...................................................................................... 90
3.2.2.
Criterios de diseo. ............................................................................ 90
3.2.3.
Modelo propuesto. ............................................................................. 91
3.2.4.
El problema de la integridad de la autentificacin. ........................... 93
3.2.4.1.
Autentificacin basada en Apache................................................. 93
3.2.4.2.
Autentificacin basada en Apache con mdulo acceso MySQL... 94
3.2.4.3.
Autentificacin basada nicamente en cdigo PHP. ..................... 96
Contenido
3.2.5.
El problema de la cach de datos de usuario.................................. 98
3.2.6.
El sistema de privilegios. ................................................................. 100
3.2.7.
Implementacin. .............................................................................. 104
3.2.7.1.
Especificaciones de la base de datos............................................ 104
3.2.7.2.
Especificaciones y notas referentes al cdigo implementado...... 106
3.3.
Protecciones contra SQL-inject y Cross Site Scripting. ................... 107
3.3.1.
Justificacin. .................................................................................... 107
3.3.2.
Implementacin. .............................................................................. 108
3.3.2.1.
Tcnica basada en regexp......................................................... 108
3.3.2.2.
Tcnica de proteccin genrica contra injecting. ................... 111
3.4.
Herramienta de administracin y gestin del portal. ............................... 117
3.4.1.
Justificacin. .................................................................................... 117
3.4.2.
Mejoras implementadas. .................................................................. 117
3.5.
El archivo de configuracin config.php. .............................................. 121
3.6.
Especificaciones de la base de datos........................................................ 123
3.6.1.
Modificacin de la nomenclatura de las bases de datos. ................. 123
3.6.2.
Otras modificaciones. ...................................................................... 125
3.7.
Fortaleza de las contraseas empleadas................................................... 126
3.7.1.
Seguridad de las contraseas almacenadas en la bd de usuarios. .... 127
3.8.
Otros problemas solucionados. ................................................................ 130
3.8.1.
Conversiones de URL...................................................................... 132
4.
Conclusiones.................................................................................................... 139
2.
Objetivos.......................................................................................................... 147
2.
Requisitos......................................................................................................... 149
vi
Contenido
3.
4.
5.
6.
7.
2.
3.
4.
mysqladmin.............................................................................................. 183
mysql........................................................................................................ 186
Cambio de contrasea de administrador.................................................. 187
5.
6.
Conclusiones.................................................................................................... 193
2.
3.
Exploit.............................................................................................................. 196
vii
Contenido
2.
Reporte de seguridad realizado con Retina contra el servidor woody. ........ 198
2.
2.
Cdigo.............................................................................................................. 234
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
2.8.
2.9.
2.10.
2.11.
2.12.
2.13.
2.14.
2.15.
2.16.
2.17.
2.18.
2.19.
2.20.
2.21.
/config/config.php.................................................................................... 234
/download/index.php................................................................................ 238
/admin/acceso_cuestionario.php .............................................................. 239
/admin/acceso_dudas.php ........................................................................ 242
/admin/acceso_encuesta.php.................................................................... 244
/admin/acceso_monitores.php.................................................................. 247
/admin/acceso_notas.php ......................................................................... 250
/admin/acceso_noticias.php ..................................................................... 253
/admin/admin_cuestionario.php............................................................... 256
/admin/admin_dudas.php..................................................................... 258
/admin/admin_encuesta.php ................................................................ 259
/admin/admin_monitores.php .............................................................. 261
/admin/admin_notas.php...................................................................... 262
/admin/admin_noticias.php.................................................................. 264
/admin/borrar_cuestion.php ................................................................. 266
/admin/borrar_duda.php....................................................................... 267
/admin/borrar_encuesta_prof.php ........................................................ 268
/admin/borrar_monitor.php.................................................................. 269
/admin/borrar_nota.php........................................................................ 270
/admin/borrar_noticia.php.................................................................... 271
/admin/borrar_todas.php ...................................................................... 272
viii
Contenido
2.22.
2.23.
2.24.
2.25.
2.26.
2.27.
2.28.
2.29.
2.30.
2.31.
2.32.
2.33.
2.34.
2.35.
2.36.
2.37.
2.38.
2.39.
2.40.
2.41.
2.42.
2.43.
2.44.
2.45.
2.46.
2.47.
2.48.
2.49.
2.50.
2.51.
2.52.
2.53.
2.54.
2.55.
2.56.
2.57.
2.58.
2.59.
ix
Contenido
2.
Captulo 1. Introduccin
Captulo 1
Introduccin
1. Antecedentes.
El Proyecto Fin de Carrera culmina y completa una larga y ardua etapa de
estudios y formacin de todo Ingeniero de Telecomunicacin.
Con la realizacin del mismo, el autor pretende poner de manifiesto
capacidades y aptitudes que ha obtenido e ido puliendo a lo largo de la carrera, tales
como su capacidad de anlisis y sntesis, y sobre todo la de resolver problemas
prcticos de una forma rpida, eficaz y profesional.
Asimismo se pretende dar rienda suelta a la creatividad del alumno. De esta
forma el Proyecto gozar de una especial frescura y, en muchos casos, de ideas
innovadoras.
Las labores de apoyo, seguimiento y, en resumidas cuentas,
de ayuda,
Pg. 1
Captulo 1. Introduccin
2. Motivacin y justificacin.
Con el amplio desarrollo de las Tecnologas de la Informacin y de las
Telecomunicaciones en general, Internet se ha consolidado como un medio de
comunicacin e intercambio de datos masivo, cada vez ms til y prspero, y a la vez
accesible a un gran (y creciente) nmero de personas. La informacin fluye
libremente de un continente a otro en dcimas de segundo con un solo clic de ratn.
Todos se benefician de este hecho: empresas y particulares, entidades
gubernamentales, docentes o de investigacin, asociaciones con o sin nimo de lucro,
etc.
Cuando, a mediados de los aos 70, naci Arpanet1, precursora de la actual
Internet, el principal objetivo que se buscaba era desarrollar una serie de protocolos y
estndares que sirvieran de base para establecer una infraestructura de
comunicaciones entre mquinas remotas. En principio se cre en un mbito muy
restringido y principalmente orientado a fines militares. De esta forma la seguridad
Arpanet fue la primera gran red, creada en los Estados Unidos, con fondos de la Agencia de
Proyectos de Investigacin Avanzada (ARPA, por sus siglas en ingls).
Pg. 2
Captulo 1. Introduccin
Pg. 3
Captulo 1. Introduccin
primera
aproximacin.
Con el avance de ciertos campos, todava en una fase bastante primitiva de
expansin, como el e-commerce (comercio electrnico), la seguridad cobra an
ms importancia. En Internet, una persona es un nmero ms (comnmente una
direccin IP). Existe pues un alto grado de impersonalidad. Esto facilita la labor de
un posible atacante, quien con unos conocimientos tcnicos no necesariamente
demasiado amplios, y si no anteponemos los medios y barreras necesarios, podr
pasearse a sus anchas y de forma annima por los ordenadores de nuestra empresa o
entidad. Si se tratase, por poner un ejemplo, de un banco, las consecuencias podran
ser fatales: podramos pasar de un simple robo de informacin al robo de cuantiosas
cantidades de dinero.
Sin embargo, no hace falta llegar a estos extremos. Cualquier intrusin en un
sistema conlleva prdidas econmicas, aunque slo sea en trminos de horas de
trabajo que le llevar a un tcnico, el cual tendr que evaluar y reparar los posibles
daos causados. Naturalmente en funcin de la importancia de la informacin
contenida en la mquina comprometida, estos costes sern de un orden de magnitud
mayor o menor.
Es tal la importancia de la seguridad que sta es exigible por ley. En Espaa,
la LOPD (Ley Orgnica de Proteccin de Datos) establece distintas categoras
teniendo en cuenta diversos factores, entre ellos el tipo de datos almacenados, y
obliga a tomar distintas medidas que garanticen la seguridad en los distintos
dispositivos de almacenamiento o mquinas en cuestin, castigando con fuertes
Pg. 4
Captulo 1. Introduccin
sanciones o multas a las empresas que las incumplan. De esta forma, informacin
sensible, como grandes bases de datos de clientes o la propia contabilidad de la
empresa, mantendr un grado de confidencialidad apropiado, fuera del alcance de un
intruso cualquiera.
A menudo, las empresas no invierten en seguridad hasta que no se ven
envueltas en algn desastre o simplemente le ocurre algo como lo comentado
anteriormente. La labor de la persona o departamento encargado de la seguridad
informtica de una empresa suele pasar desapercibida: si ste realiza bien su trabajo
simplemente no ocurrir nada. Pero si ste deja algn agujero de seguridad, tarde o
temprano alguien lo encontrar y podr usarlo en su propio beneficio, en detrimento
de los intereses de la empresa o entidad en cuestin.
En un mundo cada vez ms informatizado, en un entorno hostil -como puede
ser Internet- y cada vez ms comercial, en una red cada vez ms accesible al pblico
en general, la seguridad informtica es de vital importancia. La justificacin de un
proyecto como el que nos ocupa resulta evidente.
El presente Proyecto Fin de Carrera pretende ilustrar los conceptos ms
importantes de esta vital disciplina. Estudiaremos los problemas de seguridad y
ataques ms comunes as como la forma de abordarlos y solucionarlos. En particular,
nos centraremos en la seguridad de sitios web. Veremos cmo simples errores de
programacin se pueden convertir en graves problemas de seguridad.
Culminaremos nuestro estudio terico con un caso prctico: aplicaremos los
conocimientos y conceptos presentados en la realizacin del anlisis de la seguridad
de un portal web, proponiendo mejoras e incluso implementando alguna de ellas.
Es motivacin suficiente para m el atractivo intelectual que supone el
estudiar cmo funcionan internamente los mecanismos de seguridad utilizados en la
Pg. 5
Captulo 1. Introduccin
Red, saber cmo romperlos y por ltimo (y no por ello menos importante), tener la
capacidad de mejorarlos.
3. Alcance y objetivo.
El alcance de este proyecto, eminentemente terico pero que ser convenientemente ilustrado con la inclusin de una completa auditora de seguridad a un
portal web y posterior implementacin software de la gran mayora de las mejoras
propuestas, comprende los siguientes puntos:
El anlisis forense engloba a un conjunto de tcnicas utilizadas con el fin de obtener informacin
de un sistema que ha sido comprometido: huellas que dej el atacante, cmo lo hizo y qu pasos se
llevaron a cabo durante la intrusin, recuperacin de ficheros que fueron borrados, etc.
Pg. 6
Captulo 1. Introduccin
correctas
que
hubo
y devolver
dicha
Pg. 7
Captulo 1. Introduccin
Pg. 8
Captulo 2
1. Introduccin.
Presentaremos en este captulo las nociones de seguridad y otros conceptos
necesarios para una buena comprensin del anlisis de seguridad que llevaremos a
cabo sobre el portal web, y que presentaremos en el siguiente captulo.
El sector de la seguridad informtica es muy amplio, y abarca muchos y
diversos campos. Podramos escribir libros y libros sobre el tema, pero como es
natural no lo haremos; necesitamos centrar nuestros objetivos. Colocaremos nuestro
punto de mira sobre el tema de la seguridad en servidores web, e intentaremos no
desviarlo demasiado, salvo en situaciones especiales que requieran dar una visin
ms global de ciertos conceptos que contribuyan a un mejor entendimiento de otros
puntos explicados con anterioridad.
Una vez ledo este captulo, el lector ser conocedor de algunas de las
tcnicas ms comunes de explotacin de agujeros de seguridad va web, y quin
sabe, lo mismo le pica el gusanillo y se acaba convirtiendo en aprendiz de hacker.
Pg. 9
2. Nociones y terminologa.
2.1.
Pg. 10
A menudo simplificaremos esta notacin llamndolo servidor a secas. Por tanto, este ltimo
trmino puede resultar ambiguo. Distinguiremos su significado por el contexto.
2
Ntese de nuevo la ambigedad. En este caso, nos estamos refiriendo al software servidor web, y
no a la mquina servidora web que ejecuta dicho software. A pesar de todo, ambos conceptos estn
ntimamente ligados.
3
IP: Internet Protocol. Protocolo estndar que define a los datagramas (o paquetes) IP como la
unidad de informacin que pasa a travs de una red de redes y proporciona las bases para el servicio
de entrega de paquetes sin conexin y con el mejor esfuerzo. Incluye ICMP como parte integral.
4
TCP: Transmission Control Protocol. Protocolo orientado a conexin (antes de transmitir datos,
los participantes deben establecer la conexin) que proporciona un servicio de flujo de datos confiable
y full-duplex. Ampliamente utilizado en servicios como web o correo, slo por nombrar algunos.
5
UDP: User Datagram Protocol. Protocolo no orientado a conexin utilizado para el envo de
datagramas hacia el programa de aplicacin en otra mquina. Conceptualmente, la diferencia
importante entre los datagramas UDP y los paquetes IP es que el UDP incluye un nmero de puerto de
protocolo, lo que permite al emisor distinguir entre varios programas de aplicacin en una mquina
remota dada.
6
ICMP: Internet Control Message Protocol. Parte integral del protocolo de Internet (IP) que
resuelve errores mediante el uso de mensajes de control.
Pg. 11
aunque a veces usa adems otros puertos (como el 443, para conexiones web
encriptadas mediante SSL).
Existen para los diferentes servicios protocolos que han sido estandarizados.
Por ejemplo, para el servicio web el protocolo utilizado es conocido como HTTP7.
Estos protocolos corresponden al nivel de aplicacin (nivel 5 del modelo de
referencia TCP/IP8).
2.2.
Nociones de seguridad.
Volviendo al escenario descrito al comienzo del apartado anterior,
HTTP: HyperText Transfer Protocol. La ltima versin (1.1) se define en el RFC 2616.
En realidad, cuando anteriormente hemos hecho referencia al modelo OSI no hemos sido del todo
rigurosos. En el mundo TCP/IP, el modelo OSI no debe ser aplicado; en su lugar, debemos hacer uso
del modelo de referencia TCP/IP. A pesar de algunas similitudes, el modelo OSI consta de 7 capas o
niveles mientras que el modelo de referencia TCP/IP prescinde de dos de ellas, quedando slo en 5.
9
Hacker: persona especialmente habilidosa, tcnicamente muy capaz (definicin genrica). En el
campo de la seguridad se denomina as a la persona que es capaz de romper la seguridad de un
sistema, normalmente con el nico propsito de aprender o por la mera satisfaccin personal e
intelectual.
10
Cracker: hacker malicioso. Normalmente busca sacar algn tipo de provecho de la intrusin o del
propio servidor vulnerado.
11
El trmino intruso tiene connotaciones que implican un cierto xito del atacante. No obstante, a lo
largo de este documento usaremos indistintamente los trminos atacante e intruso.
8
Pg. 12
12
Pg. 13
ii.
iii.
Escalada de privilegios.
iv.
Pg. 14
14
Un log es un historial donde el sistema almacena los eventos ms importantes que han ocurrido
en el sistema.
Pg. 15
empresa,
que
puede
albergar
informacin
interesante
15
Pg. 16
esquema DMZ18 en el permetro de la red, para aislar las mquinas que dan servicio
de cara al pblico (por ejemplo, el servidor web de la empresa), de la red corporativa
interna, lo cual aadira un nivel ms de proteccin a nuestro esquema general de
seguridad.
Sin embargo, a la hora de evitar un ataque a un servicio web, tpicamente en el
puerto 80, un simple filtrado de paquetes va a valer de poco, ya que no filtrar el
trfico web y es precisamente este trfico el que el atacante va a utilizar para llevar a
cabo su ataque. Claramente, es necesaria una nueva lnea de defensa situada en el
propio servidor web. El servidor web debera estar correctamente parcheado contra
vulnerabilidades conocidas y configurado adecuadamente con opciones que por
defecto sean seguras. Este procedimiento aadira un nivel de seguridad ms.
No es nuestra intencin hacer un compendio de tcnicas que se suelen emplear
en seguridad. Simplemente pretendamos mostrar al lector la utilidad e importancia
de mantener distintos niveles de seguridad, y las ventajas que conlleva.
DMZ: zona desmilitarizada (demilitarized zone). Permetro de red que contiene mquinas que
atienden servicios pblicos, separadas de la red privada local. Los servidores pblicos menos seguros
estn aislados de la LAN privada.
Pg. 17
de seguridad puede significar o suponer pero creemos que es suficiente para ilustrar
el concepto.
19
20
Pg. 18
Cuando nos referimos a la pila TCP/IP, estamos haciendo alusin a la parte del sistema operativo
que se encarga de gestionar el trfico TCP/IP del sistema. Es decir, se trata de un software ms, y ser
diferente segn sea el sistema operativo empleado.
22
FIN es uno de los flags TCP que nos faltaba por nombrar.
23
Nmap es una herramienta utilizada para realizar escaneos de puertos. Haremos referencia a ella al
final de este captulo, en la seccin de herramientas tiles.
Pg. 19
Uptime: tiempo que una mquina lleva encendida, sin ningn tipo de corte o interrupcin.
Pg. 20
Para obtener la informacin anterior puede bastar con que el atacante consulte
la pgina web corporativa de la empresa (seccin de contactos, por ejemplo). Por
nombrar una alternativa, existen tambin bases de datos pblicas o servidores
Whois, de donde es posible obtener informacin administrativa acerca de una
direccin IP o de un nombre de dominio dado.
25
Pg. 21
Pg. 22
[variable2]
[variable1]
[ebp]
[ret]
[param1]
[param2]
[paramM]
Pg. 23
en s. Entre esas tareas est la de guardar el valor del registro %ebp, que contiene el
puntero de marco de pila (no entraremos en detalles), y la de reservar espacio para
las variables locales que usar ms adelante la funcin (entre las que se encuentra
nuestro buffer, que va a ser variable1). Finalmente, se pasa el control al [cdigo]
de la funcin.
El sentido de todo esto es que cuando la funcin se de por finalizada, se habr
de realizar el proceso inverso, lo que implicar la ejecucin de otra rutina llamada
eplogo, para liberar la memoria de pila reservada para las variables y recuperar el
valor de %ebp, y finalmente se saltar a la direccin de cdigo dado por el puntero
ret, con lo que volveremos al punto de partida inicial.
Cmo podemos aprovechar un buffer overflow en la variable1? Es muy
fcil. Simplemente tendremos que escribir en variable1 datos de ms, de forma que
alteremos los elementos adyacentes (que son, [ebp] en primer lugar, y finalmente,
[ret]). Modificando el valor de la direccin de retorno, dado en [ret], conseguiremos
alterar el flujo de ejecucin, ya que saltaremos a la direccin que nosotros queramos.
Pero, a qu direccin saltar?
Lo habitual es colocar el cdigo que queremos que sea ejecutado por el
programa vulnerable (normalmente ser cdigo que ejecuta una shell), en el propio
buffer, y luego sobreescribir [ret] con la direccin del propio buffer. De esta forma
tan inteligente, conseguimos que el programa vulnerable ejecuta cdigo arbitrario (de
nuestra eleccin) en el sistema. Y algo tambin importante: dicho cdigo ser
ejecutado con los privilegios del programa vulnerable. Si este programa corre como
root (en Unix) o System / Administrador (en entornos Windows), podremos
ejecutar cdigo privilegiado, y tener acceso a cualquier parte del sistema.
En realidad, todo lo que se ha explicado corresponde a un tipo muy particular
de buffer overflow (por otro lado, los ms tpicos), que son los conocidos como
Pg. 24
Pg. 25
Pg. 26
Pg. 27
Login: roman
Password: 12345
Si la base de datos devuelve alguna entrada quiere decir que exista un usuario
con dicha contrasea, y el proceso de autentificacin ha sido correcto.
Ahora bien, qu habra ocurrido si hubiramos rellenado el campo de usuario
o el de la contrasea (o ambos) con caracteres inesperados? Situmosnos en el lado
del atacante y veamos cmo procedera ste:
Login: roman
Password: ' or ''='
Pg. 28
Pg. 29
27
Pg. 30
Que equivale a:
SELECT * FROM database WHERE Login='' or 1=1;
El host destino (en este caso, 192.168.4.22) debe tener la carpeta share
compartida con permisos para todos.
Ntese que la tabla de sistema INFORMATION_SCHEMA.TABLES
contiene informacin de todas las tablas albergadas en el servidor MS SQL
Server.
Pg. 31
3.1.3. Solucin.
La nica forma fiable para evitar la inyeccin de sentencias SQL es un
correcto parseo29 de la entrada de usuario. Quiere decir esto que la Aplicacin debe
tener cuidado con los datos que recibe a travs de variables, mediante peticiones
GET, POST o incluso Cookies. Ser su obligacin filtrarlas adecuadamente, para
eliminar cualquier posible carcter malicioso (como las comillas) que un atacante
pudiera insertar.
Este filtrado se puede realizar de diversas formas, dependiendo del grado de
seguridad que deseemos y del lenguaje de programacin empleado.
La solucin ms segura tiene en cuenta la naturaleza de la variable protegida.
Consiste en filtrar todos los caracteres posibles, con la nica de excepcin de
aquellos que no consideramos perniciosos. Por ejemplo, si la variable a filtrar es de
naturaleza numrica (como podra ser un identificador numrico), el filtro eliminara
cualquier carcter que no sea una cifra (0, 1, , 9). Si la variable es
alfanumrica, se eliminaran todos los caracteres, a excepcin de los alfanumricos30.
La alternativa menos segura- es que el filtro actuara buscando ciertos
caracteres considerados malignos, dejando tal cual los restantes. Pero este mtodo
presenta el inconveniente de que es posible que nos olvidemos de filtrar alguno de
los caracteres perniciosos, o bien, en un futuro se descubra que alguno de los
caracteres que se consideraban inocuos (y por tanto, no eran filtrados) no son tales.
Qu hacer si por ejemplo se desea que una variable pueda contener comillas
simples legalmente? En este caso, el filtro estropeara un valor de la variable que
debera ser legal, al eliminar las comillas. Bien, lo que se har realmente no es filtrar
los caracteres peligrosos sino escaparlos, es decir, anteponerle un carcter especial,
29
30
Del verbo anglosajn parse, que se puede traducir como analizar sintcticamente.
Normalmente comprendidos entre A-Z, a-z, 0-9.
Pg. 32
32
Pg. 33
3.2.1. Fundamentos.
Este tipo de vulnerabilidades aparece en Aplicaciones donde se maneja
contenido web dinmico. La forma de explotarlas es muy variada. El denominador
comn es la inclusin de cdigo malicioso, como parte del contenido web de la
pgina vulnerable. El navegador de la vctima descargar, sin que sta pueda darse
cuenta, dicho cdigo y lo ejecutar de forma local. El objetivo de este cdigo
malicioso es, en muchos casos, el robo de cookies (las cuales a menudo contienen
informacin importante como el identificador de sesin del usuario vctima, o
incluso la contrasea del mismo), lo cual podra servir al atacante para secuestrar
una sesin de usuario34. Tambin se le puede dar otra utilidad, quizs ms peligrosa,
como es la explotacin de una vulnerabilidad local en la mquina vctima
(tpicamente un fallo en el navegador). La principal limitacin llegado a este punto es
la propia creatividad del atacante. Por ejemplo, la empresa de seguridad espaola
NGSec ha demostrado recientemente cmo la combinacin de un fallo XSS con una
vulnerabilidad local (en concreto, un fallo en un CGI), en el servidor web iPlanet,
resulta en una vulnerabilidad que puede ser explotada remotamente.
33
En un principio se adoptaron las siglas CSS para referirse a las vulnerabilidades de tipo Cross
Site Scripting. Ms adelante, y para evitar la ambigedad (CSS tambin es el acrnimo de
Cascading Style Sheets), se adopt el trmino XSS actual.
34
Es lo que se conoce como session hijacking.
Pg. 34
35
Pg. 35
Pg. 36
Bugtraq es el nombre de una conocida lista de correo sobre seguridad, actualmente albergada en
securityfocus.com.
Pg. 37
3.2.3. Solucin.
Una vez ms, la solucin pasa por parsear adecuadamente toda la entrada de
usuario. En particular, habr que tener especial cuidado con los caracteres < y >,
que debern ser sustituidos por < y >, respectivamente. Asimismo, se
recomienda adems reemplazar otros caracteres como (, ), # o & por
(, ), # y &, respectivamente.
La proteccin anteriormente vista, del lado del servidor, es la ms
recomendable. Sin embargo, tambin es posible que un cliente se proteja a s mismo,
simplemente desactivando funcionalidades del navegador, como el uso de Javascript
o de los controles ActiveX. Quizs la prdida de funcionalidad que obtendr el
usuario se ver recompensada por un incremento de su seguridad. Tampoco es mala
idea desconfiar de e-mails de desconocidos que contengan links37, y en general, de
todo enlace proporcionado por un extrao, sea cual sea el medio utilizado.
Dejaremos para el captulo 4 la implementacin en PHP de la primera (y ms
importante) de estas protecciones.
37
Pg. 38
Pg. 39
Perl intentar abrir el fichero anterior y para ello har uso de diferentes
llamadas al sistema. El truco est en que dichas funciones de sistema estn escritas
en C, y por tanto, manejarn de forma diferente el carcter \0; concretamente, lo
tomarn como terminador del nombre de fichero, de forma que realmente el fichero
que tratarn de abrir ser target.html (todo lo que hay despus del carcter
terminador ser ignorado). De esta forma, un obstculo que pareca insalvable (el
.db) ha sido salvado exitosamente.
Traslademos este ejemplo a la web. Supongamos que las lneas de cdigo
anteriores pertenecan al script CGI ubicado en:
http://victima.com/cgi-bin/page.cgi?database=clientes
Pg. 40
lo ejecutar.
Supongamos que tenemos el script siguiente:
# parse $user_input
$database="$user_input";
open(FILE "<$database");
Por supuesto, esta tcnica se puede combinar con la anterior, resultando til en
ciertos escenarios. Recomendamos la lectura del artculo de Rain Forest Puppy,
donde se describen a fondo esta y otras tcnicas.
La solucin a este problema es bien fcil: filtrar los caracteres |, al igual que
ya hicimos con el carcter nulo.
41
Pg. 41
<?php
if ($username==root) { // can be forged by a
user in get/post/cookies
$good_admin_login = 1;
}
if ($good_admin_login == 1) { // can be forged too
fpassthru
("/highly/sensitive/data/index.html");
}
?>
El programa tiene dos partes bien diferenciadas: una primera donde realiza
una primera comprobacin (para ver si el usuario es o no root), en funcin de la
cual asigna o no un valor a una segunda variable ($good_admin_login); y otra donde
comprueba precisamente esta ltima variable.
El problema est en esta segunda parte: si la primera comprobacin no es
correcta, la variable $good_admin_login quedar sin asignar. Qu ocurrira si el
atacante realiza esta asignacin por su cuenta? Con la opcin $register_globals =
On (por defecto en la mayora de versiones de PHP) podremos pasarle al script la
Pg. 42
42
Pg. 43
http://www.victima.com/cgi-bin/download?fichero=apuntes.zip
Supongamos ahora que, internamente, el CGI est configurado para coger
todos los ficheros del directorio /home/www/download/ de forma que lo que
har ser aadir el nombre del fichero al path anterior, y finalmente acceder a:
/home/www/download/apuntes.zip
Pg. 44
Pg. 45
Pg. 46
Podramos haber logrado un efecto similar haciendo uso de otros caracteres como el
| (pipe).
44
Pg. 47
puerto privilegiado45. Una vez hecho esto, Apache se deshace de sus privilegios y
sigue ejecutndose sin privilegios (normalmente como el usuario apache, httpd o
nobody). El proceso padre Apache crea adems varios procesos hijos, entre los que
reparte las peticiones web recibidas, que se irn procesando en paralelo.
Segn lo anterior, parece lgico que la mayora de vulnerabilidades
descubiertas en Apache puedan conducir al atacante a la obtencin del acceso remoto
a la mquina vctima, pero no de privilegios de superusuario (en primera instancia).
En la siguiente figura puede observar un ejemplo de un ataque realizado a un
servidor Apache 1.3.23 con SSL. En este caso, el bug explotado no se encuentra en el
cdigo del servidor en s, sino en uno de los mdulos aadidos (mod_ssl). Se trata
de un fallo tpico de buffer overflow.
45
Los puertos privilegiados son aquellos por debajo del 1024, excluido este ltimo.
Pg. 48
Exploit: programa, script o texto explicativo cuya utilidad es la explotacin de una vulnerabilidad
conocida.
Pg. 49
Pg. 50
Overall
Rank
------1
2
3
4
5
6
7
8
9
10
Flaw type
-------------------Buffer overflow
Directory Traversal
"Malformed input"
Shell Metacharacters
Symlink Following
Privilege Handling
Cross-site scripting
Cryptographic error
Format strings
Bad permissions
Overall
Percent
------21.8%
6.8%
5.8%
4.4%
3.6%
3.5%
3.1%
2.9%
2.8%
2.4%
Open Src.
Rank
--------1
11
6
5
2
4
8
13
3
7
Closed Src.
Rank
----------1
14
2
7
10
3
13
11
12
5
Hemos hablado ya de casi todos los tipos de fallos (flaw types) recogidos.
Enumeraremos los restantes (no espere una explicacin detallada):
Malformed input: agrupa de forma genrica a bugs derivados de una
entrada de usuario defectuosa (o malformada), y que no pueden ser
catalogados bajo otras categoras ms especficas (normalmente por falta
de datos acerca de la vulnerabilidad en s).
Symlink following: el programa vulnerable realiza operaciones con
ficheros, y admite el uso de enlaces simblicos. Si un atacante tuviera
acceso de escritura al directorio donde se guardan los archivos con los que
trabajar la aplicacin, podra por ejemplo, crear un fichero de tipo enlace
simblico al fichero de contraseas /etc/passwd, y forzar al programa
vulnerable a que acceda a este ltimo, a travs del enlace.
Privilege handling: cubre dos casos: primero, cuando se le asigna a un
proceso o funcin ms privilegios de los que se supone debera tener; y
segundo, el caso de que un atacante pueda saltarse mecanismos de
autentificacin, para acceder a una capacidad privilegiada.
Cryptographic error: se refiere a diseos inseguros (un algoritmo
malo) o una implementacin incorrecta de un algoritmo criptogrfico.
Format strings: los bugs de cadena de formato aprovechan la
expansin de cadenas como %x en funciones del tipo printf().
Pg. 51
4. Herramientas tiles.
No queramos dejar pasar por alto la oportunidad de mostrar alguna de las
herramientas ms tiles en el campo de la seguridad. Estas herramientas son armas
de doble filo: sern usadas tanto por profesionales de la seguridad que tratan de
securizar o proteger sus sitios web, como por vidos atacantes a punto de realizar
alguna fechora.
Este apartado no pretende mostrar una coleccin de herramientas que todo el
mundo debera tener, sino slo algunas de ellas que nos han resultado bastante
representativas. La mayora son muy conocidas; algunas otras no lo son tanto.
47
Las aplicaciones open source son aquellas cuyo cdigo fuente es pblico (lo cual no quiere decir
necesariamente que sean gratuitas, aunque en muchos casos lo son). El entorno utilizado por nuestro
portal est basado en aplicaciones de este tipo y es adems totalmente gratuito.
Pg. 52
4.1.
Nmap.
Desarrollada por un hacker apodado Fyodor, NMap (Network Mapper) es
48
Pg. 53
4.2.
Proxomitron.
Esta potente herramienta para entornos Windows es ideal para probar la
seguridad de un sitio web. Se instala como un proxy local e intercepta todo el trfico
web que pasa a travs de l, permitiendo visualizarlo y analizarlo.
Pg. 54
que suelen abrirse automticamente al visitiar ciertas pginas web (para ello,
Proxomitrn interceptar funciones JavaScript como window.open).
4.3.
Tcpdump.
Se trata del sniffer de trfico probablemente ms conocido. Su interfaz no es
grfica, sino que est basada en texto. Principalmente funciona en sistemas Unix,
aunque tambin existe una versin portada a Windows (llamada Windump).
Pg. 55
4.4.
CommView.
CommView es un excelente sniffer para Windows. Se trata de un producto
Pg. 56
Pg. 57
4.5.
Retina.
Retina es un potente escner de vulnerabilidades desarrollado por la
Pg. 58
Captulo 3
1. Introduccin.
A lo largo de este captulo pondremos en prctica los conceptos mostrados en
puntos anteriores: procederemos a auditar la seguridad de un site web real en
profundidad. Tambin estudiaremos algunas soluciones tpicas a los problemas
encontrados. Desarrollaremos algunas de estas soluciones e ideas as como ciertas
optimizaciones en el captulo siguiente.
2. Escenario.
Las pginas web a auditar corresponden al sitio web docente del profesor
Federico Jos Barrero Garca. stas constan de un alto contenido esttico (ficheros
HTML, imgenes, etc.) y una parte dinmica, plasmada esta ltima en la
implementacin de dos portales web, correspondientes a dos de las materias que
Pg. 59
Pg. 60
comunes a ambos portales y dos servicios que son inherentes a cada uno de los
mismos (uno por cada portal).
Pg. 61
Los datos usados en cada servicio son almacenados en bases de datos, y estas
ltimas residen en un servidor MySQL. De esta forma, la Aplicacin puede lanzar
peticiones al servidor MySQL, en forma de sentencias SQL, y as poder acceder a los
datos, ya sea para consultarlos o realizar operaciones de administracin (aadir,
editar o borrar) sobre ellos.
El lenguaje de programacin usado en la Aplicacin es, como anunciamos ya,
PHP. Entre sus caractersticas principales contamos con un fcil acceso a bases de
datos. El API de PHP es muy amplio: cuenta con multitud de funciones para manejar
cadenas, arrays y en general cualquier tipo de datos; tiene soporte para el acceso a
diversas bases de datos (y en particular, MySQL) y en general, est orientado a la
programacin web, lo que lo hace ideal en nuestro escenario. Adems se integra
perfectamente con diferente software de servidor web, y en especial, con el software
Apache, que ser el que utilizaremos en nuestro montaje.
As pues, un esquema que ilustra los componentes que definen el escenario en
el cual se ejecutar nuestra Aplicacin es el siguiente:
PHP
Base de datos
MySQL
Cliente
Cliente
Pg. 62
parsear el fichero y llevar a cabo las acciones que mande el cdigo incrustado en
l. Algunas de estas acciones requerirn el acceso al servidor MySQL.
Por falta de espacio de disco en el servidor web principal, los ficheros y
pginas web que componen el portal se encuentran distribuidos en dos servidores
web diferentes.
El servidor web principal, llamado woody, es el nico de los dos que tiene
salida a Internet (tiene una IP pblica). Sus datos son:
Nombre: woody.us.es
IP: 193.147.161.237
Alias: www.gte.us.es
Nombre: apache
IP: 172.16.1.48
Nota: existe una cierta ambigedad por el hecho de haber usado el nombre de
mquina apache, que tambin coincide con el nombre del software que usaremos
para servir pginas (Apache). El contexto, en estos casos, siempre ayuda a
diferenciar, pero adems intentaremos, de ahora en adelante, escribir el nombre de
mquina todo en minsculas mientras que cuando nos refiramos al software
usaremos maysculas al principio de palabra.
Ambos servidores web corren el software Apache, y para que todas las
pginas (incluidas las albergadas en el servidor secundario) sean visibles desde
Pg. 63
Internet, se hace uso de una funcionalidad que tiene el software Apache y que
permite que un servidor acte de proxy hacia un segundo servidor.
La mayora de las pginas, incluida la principal, se encuentran en:
CSED: http://www.gte.us.es/~fbarrero/CSED/
LIE:
http://www.gte.us.es/~fbarrero/LIE/
CSED: http://www.gte.us.es/fbarrero/csed/
LIE:
http://www.gte.us.es/fbarrero/lie/
Pg. 64
ProxyPass /fbarrero
ProxyPassReverse /fbarrero
http://172.16.1.48/fbarrero
http://172.16.1.48/fbarrero
Este tnel entre ambos servidores web, que se establece por medio del proxy,
puede tener implicaciones en la seguridad. Hablaremos sobre esto ms adelante.
Por ltimo, y para finalizar con la descripcin del escenario a auditar,
comentaremos algunos aspectos relacionados con la base de datos.
La estructura actual de los datos en el servidor MySQL se resume en los
siguientes puntos:
Pg. 65
3. Anlisis de seguridad.
La seguridad de un sistema depende a su vez de la seguridad de cada uno de
los subsistemas que lo compone. Por tanto, es lgico que analicemos, en primer
lugar, cada uno de estos subsistemas por separado, extraigamos conclusiones, y
finalmente, estudiemos cmo afectaran las vulnerabilidades encontradas en cada
subsistema, al funcionamiento global del sistema.
Dicho lo anterior, y ya centrndonos en nuestro escenario particular, se
entiende fcilmente que no debemos limitar nuestro anlisis a auditar simplemente el
cdigo de la Aplicacin sino que tambin habremos de extendernos sobre otros
aspectos, como por ejemplo la seguridad del propio servidor web que alberga las
pginas. En realidad, y a partir de aqu, resulta tentador dar un paso ms hacia
adelante, y de ah otro, etc.; para finalmente acabar auditando la red completa donde
se encuentran fsicamente los servidores. Bien, no es nuestra intencin llegar tan
lejos, y nuestras cotas o alcance del anlisis vendrn impuestas por el tiempo del que
disponemos para realizar la auditora, y en ltima instancia, por el sentido comn.
En cualquier caso, se ha decidido estructurar el anlisis de la siguiente forma:
Pg. 66
3.1.
Todos los datos asociados a los distintos servicios que nuestra Aplicacin
provee son guardados en una base de datos. Si alguien consiguiera acceder a esta
base de datos podra modificar datos a su antojo o borrarlos, con todo lo que eso
implica. El papel que juega el servidor de bases de datos es, pues, crucial.
Pg. 67
3.1.3. Conclusiones.
Aunque los fallos encontrados no son extremadamente graves, s habr que
tenerlos en cuenta. De hecho, ambos sern subsanados. En particular, se describir en
el prximo captulo la poltica de usuarios y privilegios implantada, en lo que a la
base de datos respecta.
3.2.
Pg. 68
ataque, como por ejemplo, de Ingeniera Social), o quizs lograr acceso al servidor
Unix donde se ubica nuestra Aplicacin.
Pg. 69
Pg. 70
3.2.2.2.
Pg. 71
3.2.2.3.
Pg. 72
3.2.2.4.
Entre los ficheros que forman el conjunto de la Aplicacin (.html, .php, etc.),
hemos encontrado diversos archivos de texto (ASCII) que contienen informacin
sensible (listado de alumnos, paths absolutos de los ficheros de la Aplicacin en el
servidor, etc.). Estos ficheros se encuentran en directorios de la web, y pueden ser
accedidos pblicamente, previo conocimiento de su ubicacin exacta (lo cual
tampoco es difcil teniendo en cuenta que la documentacin del portal es pblica o
que se pueden aprovechar otras vulnerabilidades para obtener informacin de los
directorios del servidor).
Enumeramos algunos ejemplos:
o http://woody.us.es/fbarrero/lie/encuesta/registro_fer.txt
o http://woody.us.es/fbarrero/lie/encuesta/ListadoAlumnos.txt
o diversos ficheros WS_FTP.LOG encontrados en la mayora de
directorios y subdirectorios.
Mediante el primer enlace un atacante obtendra acceso al listado de alumnos
(y su D.N.I.) que han realizado la encuesta correspondiente a uno de los profesores.
El segundo enlace nos dara acceso a la totalidad del listado de alumnos (y D.N.I.
asociados).
Pg. 73
3.2.2.5.
Pg. 74
3.2.2.6.
Pg. 75
3.2.3. Conclusiones.
El elevado nmero de fallos encontrados as como la gravedad de algunos de
ellos deja entrever que el autor original del portal no se preocup por la seguridad de
su Aplicacin o simplemente desconoca por completo estos aspectos.
Tambin hemos podido comprobar cmo la combinacin de vulnerabilidades
de distinta naturaleza puede resultar en un agujero de seguridad ms grave de lo que
en principio se pudiera imaginar. Tal ha sido el caso del fallo de tipo security by
obscurity en combinacin con el listado de directorios que permita el servidor (y
que estudiaremos en el siguiente punto).
Pg. 76
Otra muestra que ilustra el concepto anterior la tenemos al combinar otras dos
vulnerabilidades: ausencia de permisos y usuarios en la base de datos (descrito en
el apartado Anlisis de seguridad del servidor MySQL y bases de datos asociadas)
y los problemas de inyeccin de SQL descritos en el apartado actual. El alcance de
esta segunda vulnerabilidad viene dado por la primera: al carecer de una poltica de
usuarios y permisos correcta, y realizarse todas las operaciones de la base de datos
bajo el superusuario (root), un atacante mediante inyeccin de SQL- podra
ejecutar sentencias SQL que requieran de privilegios administrativos (el intruso
tendr acceso a la totalidad del servidor MySQL y bases de datos que ste contenga).
De otra forma, si se hubiera planificado e implementado una poltica adecuada,
segn la cual cada sentencia SQL se ejecutara bajo un usuario con privilegios
limitados, el alcance o mbito de poder del intruso se vera mermado y acotado (en
particular, slo podra alterar la informacin accesible por el usuario de bajos
privilegios, y no tendra acceso a la totalidad del servidor MySQL, como ocurra
anteriormente). Recalcamos pues la importancia de este tipo de medidas limitadoras
de privilegios y que acotan o limitan el alcance de un intruso, en caso de que la
seguridad del servidor haya sido comprometida por otras vas.
3.3.
Pg. 77
pertinente. Puesto que no tenemos cuenta ni ningn otro tipo de acceso en woody,
no nos queda otra alternativa que analizarlo desde fuera. No disponemos de tiempo
suficiente para realizar tests de penetracin en woody (que sera lo ideal) por lo
que nos limitaremos a lanzar contra l un escner de vulnerabilidades, para obtener
una panormica de los servicios que ofrece, las versiones de los demonios que corre
y cuales de stas podran ser vulnerables. As de paso veremos un ejemplo de
funcionamiento de este tipo de programas; creemos que puede ser bastante
ilustrativo. El resultado as obtenido nunca puede ser tomado como definitivo; ser
ms bien algo orientativo que debera servir de base para posteriores pruebas y
anlisis que, por falta de tiempo, nos vemos imposibilitados de realizar.
El estudio realizado por el escner de vulnerabilidades Retina, lanzado
sobre woody, ha quedado plasmado en el Apndice D de este Proyecto Fin de
Carrera. Recomendamos encarecidamente su lectura.
Pg. 78
3.3.2.2.
3.3.2.3.
Si lanzamos una peticin al servidor web, del tipo GET /directorio/, Apache
comprobar si existe una pgina ndice (normalmente index.html o index.php,
dependiendo de la configuracin de Apache) contenida en dicho directorio. Si as es,
Pg. 79
servir dicha pgina. Si no existe pgina ndice alguna, Apache intentar mostrar el
contenido del directorio, esto es, servir un listado de ficheros de dicho directorio.
Este es el comportamiento por defecto, y el que hemos observado en los servidores
web auditados.
Un simple listado de directorio puede revelar informacin adicional importante a un atacante, segn qu escenarios. Sin ir ms lejos, en el caso que nos ocupa
nos sirvi para listar el contenido del directorio /admin/, que contena los scripts de
administracin del portal (aquellos que supuestamente estaban escondidos), para
ms adelante intentar explotarlos individualmente.
Nuestra recomendacin es deshabilitar el listado de directorios en Apache.
Para ello, no tenemos ms que buscar y comentar (o borrar) la siguiente lnea en el
fichero de configuracin de Apache (httpd.conf):
Options Indexes
Pg. 80
3.3.2.4.
0 *:www-http
*:*
LISTEN
24613/httpd
tcp
0 *:mysql
*:*
LISTEN
309/mysqld
tcp
0 *:ssh
*:*
LISTEN
320/sshd
tcp
0 *:telnet
*:*
LISTEN
258/inetd
tcp
0 *:ftp
*:*
LISTEN
258/inetd
udp
0 *:ntalk
*:*
258/inetd
udp
0 *:talk
*:*
258/inetd
Los servicios de ntalk y talk se usan para que usuarios de diferentes mquinas
puedan hablar entre s (mediante mensajes de texto interactivos, a modo de chat)
y rara vez son realmente necesarios.
El servicio telnet es considerado tradicionalmente inseguro, entre otras cosas,
porque establece sesiones sin encriptar (viajan en texto plano a travs de la red), que
pueden ser espiadas fcilmente por un atacante mediante tcnicas conocidas como
sniffing). Su funcin es suplida perfectamente por el servicio ssh, el cual adems
es ms seguro.
Pg. 81
3.3.3. Conclusiones.
Corresponde al administrador de sistemas la labor de mantener al da el
software de sus servidores, libre de fallos y vulnerabilidades. En este apartado hemos
descubierto y analizado algunos de estos agujeros.
Las vulnerabilidades encontradas en apache son bastante serias. Si bien esta
mquina no se encuentra accesible directamente desde Internet (woody acta como
proxy), s que podra ser fcilmente atacada desde el interior de la LAN, o bien, por
un atacante que previamente hubiera logrado acceso a la red, comprometiendo otras
mquinas vecinas.
El propio esquema de acceso a apache, a travs de woody, tambin
constituye por s mismo un problema de seguridad, ya que el primer servidor se
encuentra en el interior de la LAN, y sin embargo podra ser comprometido
directamente desde Internet, gracias a la redireccin de trfico que lleva a cabo
woody. Un esquema ms robusto sera ubicar a apache en un segmento de red
distinto
de
la
LAN,
llamado
zona
desmilitarizada
(DMZ),
aislar
Pg. 82
adicional, no sera mala idea instalar parches de seguridad extra para el ncleo de
Linux, como por ejemplo, proteccin genrica contra buffer overflows (nonexecutable stack -regin de pila no ejecutable-). Una coleccin muy buena que
recopila algunos de estos parches es conocida bajo el nombre de grsecurity.
Recomendamos su instalacin encarecidamente.
4. Conclusiones.
Una vez finalizado el anlisis de seguridad de cada una de las partes que
componen nuestro sistema auditado, estamos en condiciones de diagnosticar u opinar
sobre la seguridad de nuestro escenario, considerado de forma global.
Podemos calificar la seguridad global del sistema como de un grado de
vulnerabilidad medio-alto. Resulta evidente que la Aplicacin no se dise con la
seguridad en mente sino que sta fue ignorada por completo. Adems, el cdigo
auditado presenta, en general, un acentuado desorden, lo que ha dificultado el
anlisis, y una vez ms, pone en evidencia al programador del portal.
En cuanto a la configuracin de los servidores (Apache y PHP) stos se
encontraban con la configuracin que viene por defecto al instalar dichos paquetes de
software. No haba sido optimizada en absoluto. Se recomienda echar un vistazo al
Apndice A (Instalacin y configuracin de un entorno seguro basado en Apache /
PHP / MySQL) del presente Proyecto Fin de Carrera.
Pg. 83
Captulo 4
1. Introduccin.
A lo largo de este captulo, que promete ser bastante denso y completo,
resolveremos la totalidad de los problemas encontrados. Expondremos las soluciones
que se han decidido implementar en detalle y las razones que nos han llevado a
hacerlo.
No slo responderemos a las vulnerabilidades descritas en el captulo
anterior, sino que tambin daremos cabida a mejoras sugeridas por el tutor o incluso
el propio autor de este Proyecto Fin de Carrera, y que en definitiva contribuirn a
aumentar la calidad del portal web.
Pg. 84
2. Objetivos.
La implementacin que llevaremos a cabo perseguir, en lneas generales, los
siguientes objetivos:
Aadir un soporte de usuarios y autentificacin adecuados, de forma
que sea posible restringir el acceso a distintas reas del portal.
Aadir flexibilidad y portabilidad (as se facilita la labor de crear un
nuevo portal a partir del original).
Solucionar vulnerabilidades encontradas durante el anlisis de
seguridad y en definitiva, mejorar la seguridad del portal.
Simplificar cdigo en algunos casos e incluso depurar la Aplicacin
(correccin de errores tipo warning o notice, por ejemplo).
Mejorar y completar la herramienta de administracin (en particular,
aadiremos opciones de edicin entre otras hasta ahora inexistentes;
tambin crearemos una serie de mens de administracin muy
intuitivos y fciles de usar, a la vez de potentes).
El alcance de la implementacin es total (llegando a tocar incluso la propia
estructura de la base de datos, la cual se ver beneficiada por diversas optimizaciones
y mejoras).
Pg. 85
3. Implementaciones.
3.1.
3.1.1. Justificacin.
Una de las vulnerabilidades que encontramos en el anlisis realizado al
servidor MySQL en el captulo anterior fue precisamente la ausencia de este tipo de
poltica de seguridad. La Aplicacin siempre acceda al servidor MySQL con la
cuenta root (de mximos privilegios).
En el caso de nuestra Aplicacin, y por poner un ejemplo, si un atacante
encontrara la forma de ejecutar sentencias SQL (haciendo uso de la tcnica conocida
como inyeccin de SQL), habra obtenido acceso a todo el servidor MySQL (no
slo a las bases de datos del portal, sino tambin a cualquier otra que estuviera
siendo albergada por el servidor). El problema sera grave.
Es buena tctica limitar el grado de privilegios con los que se ejecutan
distintas operaciones, de modo que un usuario no obtenga permisos que nunca va a
necesitar. De esta forma, si un atacante consiguiera acceso a esa cuenta de usuario, su
campo de accin estara acotado por las limitaciones de permisos impuestas a la
cuenta.
Pues bien, hemos decidido implantar una poltica de seguridad, bastante
simple, pero que tendr efectos positivos en la seguridad. De paso servir para
ilustrar el concepto que hemos tratado de explicar.
Pg. 86
Es importante no confundir los usuarios de MySQL con otro tipo de usuarios (como pueden ser los
del propio portal o Aplicacin que son los que se manejan desde la herramienta de administracin,
o incluso los del sistema Unix donde est instalado el software servidor web).
Pg. 87
3.1.3. Implementacin.
El fichero SQL que implementa la poltica de seguridad expuesta se puede ver
en la figura 4.1.
Para una ms fcil comprensin de la sintaxis utilizada, se recomienda la
lectura del Apndice B (Seguridad bsica en bases de datos MySQL) del presente
Proyecto Fin de Carrera.
Pg. 88
por un lado hemos conseguido aislar las bases de datos propias del portal,
de otras que pudieran existir en el servidor MySQL. Dicho de otra forma,
nuestra Aplicacin slo puede acceder a las bases de datos propias del
portal; ni siquiera tiene acceso a aspectos generales del servidor MySQL.
En caso de que la Aplicacin fuera comprometida, el mayor dao que
podra causar un atacante sera eliminar datos del portal, pero no afectara
a otras bases de datos que pudieran convivir con las nuestras, en el
servidor MySQL.
3.2.
Realmente tambin podr insertar nuevas encuestas en la base de datos correspondiente pero no le
ser posible modificar o borrar las que ya existieran.
Pg. 89
3.2.1. Justificacin.
El hecho de tener al usuario totalmente controlado no slo mejora aspectos
tan importantes como la seguridad sino que adems favorece o estimula la creacin
de nuevos servicios orientados al alumno, en cuanto a que es posible discriminar la
informacin que el portal ofrece, segn
administrativo (es ms fcil mantener una nica tabla de usuarios que cinco; adems,
se produce un efecto acumulativo: si aadimos nuevos servicios al portal, el
problema se acenta).
Flexibilidad (de forma que sea sencillo aadir nuevos atributos a los
usuarios en caso de querer implementar nuevos servicios, o que, por
Pg. 90
Rendimiento (el sistema deber estar optimizado para que el impacto del
nuevo cdigo en costes de tiempos de computacin y de acceso, sea
mnimo).
Pg. 91
Pg. 92
pensando en la posibilidad de que esta nueva cuenta s pueda contar con los
privilegios necesarios para acceder al servicio en cuestin.
Existen varios problemas (a los que pondremos solucin).
3.2.4.1.
Pg. 93
existen otras posibilidades. De esta forma, podramos ubicar los distintos servicios en
directorios separados, y aplicar distintas polticas de seguridad a cada directorio.
Sin embargo, estamos rompiendo con uno de nuestros criterios de diseo:
aquel que garantizaba la independencia del sistema de autentificacin con el servidor
web subyacente. Nuestro sistema de autentificacin slo funcionara en Apache.
Adems, esta primera aproximacin implicara que el Administrador del
servidor web nos debera dar acceso a ciertas configuraciones de Apache e incluso
permitir modificar en tiempo real ficheros que afectarn a dicha configuracin (por
ejemplo, el que debiera contener nombres de usuario y contraseas, de acceso a los
distintos servicios). Esto acarreara efectos indeseados que pudieren atentar contra
los ms elementales principios de la seguridad.
Por ltimo, tampoco est claro cmo se llevaran a cabo las actualizaciones de
usuarios (alta o baja de cuentas, cambios, ). En principio, Apache slo maneja
ficheros, luego estos datos deberan encontrarse en ficheros. Qu ocurrira si dos
administradores legtimos del portal intentan realizar alguna operacin sobre el
fichero de usuarios al mismo tiempo? Las consecuencias seran impredecibles,
pudiendo llegar incluso a la destruccin del fichero de usuarios o a distintas
incoherencias. Son problemas tpicos que se resuelven mediante el uso de un servidor
de bases de datos como MySQL, as qu, por qu no integrar Apache con un acceso
a bases de datos basado en MySQL?
3.2.4.2.
Pg. 94
Pg. 95
3.2.4.3.
Pg. 96
El principal punto dbil de este mtodo es que slo es vlido para proteger
archivos con extensin .php, ya que la proteccin se incluye en cdigo dentro del
propio archivo. La solucin no valdra para proteger contenido esttico (en este caso,
habra que recurrir a la segunda aproximacin: la que usa Apache y el mdulo de
acceso a MySQL).
Sin embargo, la limitacin anterior no nos afecta, ya que la totalidad de los
servicios que tenemos planificado proteger estn implementados en PHP.
Hay una excepcin: la documentacin en PDF de la asignatura correspondiente al portal tambin ha sido protegida. Cmo es posible esto, sabiendo que son
archivos estticos (con extensin .pdf)?
La solucin para el caso excepcional anterior ha involucrado la creacin de
un nuevo script, que acta de wrapper o intermediario en la entrega de los ficheros
PDF que podrn ser descargados. La idea se resume en los siguientes puntos:
Pg. 97
Pg. 98
Un usuario con shell en la mquina tendr acceso al directorio /tmp. Aunque no podr leer ni
modificar el contenido de los diferentes ficheros de sesin (ya que stos tendrn permisos UNIX
restrictivos, como 600), s estar visualizando los nombres de los archivos de sesin, o lo que es lo
mismo, podr obtener identificadores de sesin vlidos. Podra entonces iniciar una conexin web al
portal, falsear su cookie (cambiar el identificador de sesin actual por uno de los que acaba de
obtener) y suplantar a cualquiera de los usuarios que se encontraran conectados en ese momento. Por
esta razn, recomendamos no utilizar /tmp como directorio de temporal, sino otro directorio escogido
al efecto, y cuyos permisos de lectura sean ms restrictivos.
Pg. 99
Una vez borrados este tipo de ficheros, las sesiones activas dejan de tener
validez y los usuarios que se encontraran trabajando debern iniciar una nueva
sesin. En realidad, este procedimiento rara vez (por no decir nunca) ser realmente
necesario.
Es esto un error de diseo? Por qu se ha implementado as? No, no es un
error de diseo sino una solucin de compromiso entre seguridad y rendimiento,
adoptada tras analizar y sopesar los pros y los contras de usar o no cach. El uso de
la cach optimiza el rendimiento. Finalmente, hemos llegado a la conclusin de que
la ganancia en trminos de rendimiento supera con creces, en este caso, a los
pequeos problemas derivados de la existencia de cach (y que en ltima instancia,
hemos visto que, adems, tienen solucin), por lo que se ha decidido no prescindir de
ella.
Imaginemos por un momento que no se hubiera implementado esta cach: el
problema que estamos discutiendo habra quedado zanjado; sin embargo, cualquier
comprobacin de privilegios (y como vimos en el punto anterior, sta se hace en cada
script de PHP perteneciente a un servicio protegido, y no slo en el de entrada al
mismo) conllevara un acceso al servidor MySQL, lo cual implicara que la carga de
todo el sistema aumenta (se generara trfico de red adicional en caso de que el
servidor MySQL no sea local y en todo caso, se producira un retardo debido al
acceso al servidor MySQL ya sea en local o en remoto).
Pg. 100
download:
ownload: permite bajarse documentacin PDF de la asignatura.
encuesta_w:
encuesta_w: permite administrar el servicio "encuesta".
Pg. 101
Pg. 102
que se encargue de aadir usuarios, pero que no puede borrar a los ya existentes,
etc.).
Ntese tambin que hay tres flags marcados como encuestaX, donde X es
un nmero que identifica a un profesor. Si por ejemplo un usuario tiene activo el flag
encuesta2 quiere decir que ya ha evaluado correctamente al profesor 2 mediante el
servicio de encuesta, y que por tanto, no podr rellenar otra encuesta para dicho
profesor. Esto soluciona uno de los problemas que tenamos pendientes del captulo
anterior: antes se usaban tres ficheros de texto, donde se iban agregando los nombres
de los usuarios que ya haban rellenado la encuesta correspondiente a cada profesor.
Esto no era eficiente (es ms acarreaba problemas de seguridad, como ya vimos),
mientras que la solucin que hemos implementado mediante el uso de flags, s que lo
es.
El permiso admin_tool controla si el usuario tendr acceso al men de
administracin. Es importante recalcar que esto no quiere decir que vaya a poder
realizar tareas administrativas. Para que esto ltimo sea posible el usuario deber
tener activados los flags de administracin (normalmente aquellos acabados en
_w) correspondientes a los servicios que desee administrar.
Por ltimo, el permiso chpass controla si se le permitir al usuario cambiar
su contrasea o no. Normalmente este flag estar siempre activado, para dar mayor
flexibilidad al usuario, aunque esto implique que dicho usuario se ha de hacer
responsable de la fortaleza de la nueva contrasea instaurada. En caso de polticas de
seguridad muy severas, donde es vital que las contraseas sean muy seguras, es
buena idea deshabilitar este flag (de esta forma, el usuario permanecer con su clave
inicial, la cual ser generada por la Aplicacin y, por construccin, ser muy segura).
Como se puede apreciar, el sistema de privilegios es altamente granular y da
cabida a un gran abanico de posibilidades: podremos nombrar a una o varias
Pg. 103
personas que tendrn privilegios para modificar el tabln de noticias, otras podrn
insertar dudas en el tabln de dudas, otras podrn administrar los usuarios del
portal (a distintos niveles) y finalmente podrn existir usuarios que combinarn cada
uno de los privilegios posibles, pudiendo hacerse cualquier mezcla, por rara que
parezca.
3.2.7. Implementacin.
3.2.7.1.
Pg. 104
USE usuarios_csed;
CREATE TABLE cuentas (user char(16) primary key not null,
pass char(32) not null, realname varchar(50), modificado timestamp);
CREATE TABLE permisos (user char(16) primary key not null,
usuarios_list bool not null default 0, usuarios_edit bool not null
default 0, usuarios_del bool not null default 0, usuarios_add bool
not null default 0, download bool not null default 0, dudas_r bool
not null default 0, dudas_w bool not null default 0, encuesta_r bool
not null default 0, encuesta_w bool not null default 0, encuesta1
bool
not
null
default
0,
encuesta2
bool
not
null
default
0,
encuesta3 bool not null default 0, notas_r bool not null default 0,
notas_w bool not null default 0, noticias_r bool not null default 0,
noticias_w bool not null default 0, cuestionario_r bool not null
default 0, cuestionario_w bool not null default 0, monitores_r bool
not null default 0, monitores_w bool not null default 0, admin_tool
bool not null default 0, chpass bool not null default 0);
grant select, insert, update, delete on usuarios_csed.* to
csed_admin@localhost ;
grant select on usuarios_csed.* to csed@localhost ;
grant
update
(encuesta1,
encuesta2,
encuesta3)
on
usuarios_csed.permisos to csed@localhost ;
insert
into
cuentas
values
('root',
md5('j0nj0n'),
'Administrador', NULL);
insert into permisos values ('root', 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
Pg. 105
3.2.7.2.
Pg. 106
requerir que el usuario que lo est ejecutando tenga activado el flag noticias_r; si
no es as, el chequeo resultar fallido y el script no continuar.
<?php
require('../config/config.php');
check_privs('noticias_r');
?>
3.3.
3.3.1. Justificacin.
Trataremos ambos problemas de forma conjunta puesto que su naturaleza es
similar. No dejan de ser fallos causados por una insuficiencia en el chequeo de
entrada de datos de usuario, y la solucin en ambos casos es la misma: filtrar
caracteres maliciosos.
Pg. 107
Dado que son problemas que afectan a la seguridad, deben ser resueltos sin
contemplaciones.
3.3.2. Implementacin.
Se han propuesto varias soluciones al respecto. Como ya hemos adelantado,
todas se basan en filtrar los caracteres peligrosos de la entrada de usuario. Tambin
todas ellas se basan en la poltica de seguridad ms segura: la denegacin por
defecto. Es decir, no recorremos los variables de entrada en busca de caracteres
maliciosos, para luego eliminarlos, sino que simplemente recogeremos todos los
caracteres que sabemos con certeza que no son peligrosos (por ejemplo, los
alfanumricos) y descartaremos todos los dems. De esta forma, no es posible que
se nos olvide filtrar algn carcter malicioso (como podra ocurrir de hacerlo segn
el primer mtodo); en todo caso, se nos podra olvidar permitir un carcter que no
lo es, lo cual no sera especialmente problemtico (al menos no constituir problema
de seguridad alguno).
Las diferencias entre las soluciones que vamos a proponer estriban en la forma
de aplicar esos filtros y tambin en la implementacin de los filtros en s.
3.3.2.1.
Pg. 108
Tal y como es posible apreciar tenemos dos filtros: uno que slo deja pasar
caracteres alfanumricos5, y otro que filtra todo excepto los caracteres numricos.
Supongamos que tenemos ahora una variable que, por su naturaleza, sabemos
que va a ser siempre numrica (por ejemplo, un identificador usado en una tabla de la
base de datos, llammosle id). Asumamos tambin que dicho identificador se pasa
a un script dado, el cual lo usar para construir una sentencia SQL de consulta a la
base de datos. Podramos tener un caso tpico, en el que un atacante intentar
modificar el valor de la variable $id para, por ejemplo, intentar inyectar cdigo SQL.
Cmo nos protegeramos de esto usando la tcnica propuesta?
Bien, simplemente tendramos que incluir en el script PHP, antes de construir
la sentencia SQL, una lnea de cdigo como sta:
5
Pg. 109
filtro_numerico ($id);
As de simple. La funcin recibir la variable $id (mediante paso de
parmetros por referencia, en este caso), la limpiar asegurndose de que slo
queden dgitos, y la guardar de nuevo. Como resultado, hemos podido filtrar
cualquier carcter malicioso que el atacante hubiese podido introducir.
La solucin implementada es muy segura (quizs la ms segura que se nos
pueda ocurrir), pero tiene dos inconvenientes. El primero es que nos obliga a
repasar todo el cdigo de la Aplicacin, en busca de variables potencialmente
peligrosas; esto es bastante tedioso. El segundo y ltimo es que quizs estos dos
filtros genricos no nos valgan (imaginemos el caso de una variable que pueda
contener dgitos, letras y algunos signos de puntuacin). En este caso, y dependiendo
de los caracteres que deseemos sean vlidos, quizs sea posible disear un nuevo
filtro, de una forma rpida, con tan slo copiar y pegar cdigo de alguno de los filtros
ya diseados y posteriormente aadir a la expresin regular los nuevos caracteres
vlidos que deseemos.
Pero esto no siempre es factible. Supongamos que uno de los caracteres a
permitir son las comillas simples o algn otro carcter de los considerados
peligrosos. Si simplemente permitiramos este tipo de caracteres estaramos
dejando desprotegida la Aplicacin. En este caso, la solucin es escapar ese
carcter, o lo que es lo mismo, anteponer el carcter \ (barra invertida) al carcter
peligroso, para que ste sea considerado como un carcter normal. Tampoco es que
sea algo difcil de implementar (de hecho, no lo es), pero se ve que el mtodo
requiere un cierto conocimiento de cmo funcionan los ataques que pretendemos
evitar, y cuanto menos, un cierto trabajo de exploracin del cdigo y adecuacin de
las funciones que van a realizar el filtrado.
Pg. 110
3.3.2.2.
A veces no es fcil auditar cdigo que ha escrito otra persona, sobre todo, si
sta no ha puesto el suficiente empeo para que su cdigo sea legible y fcilmente
comprensible (uso abundante de comentarios, etc.). En cualquier caso, nos llevar un
tiempo precioso. Por tanto, un mtodo como el propuesto en el punto anterior puede
no ser viable (simplemente, por falta de tiempo6).
La presente tcnica pretende ilustrar dos nuevos aspectos. Por un lado, el
filtrado se va a realizar gracias a funciones que ya vienen implementadas en el
lenguaje PHP y que estn precisamente diseadas a medida, por los desarrolladores
de este lenguaje, para evitar ciertos tipos de ataques, como los que pretendemos
erradicar. Por otro lado, nuestra intencin es encontrar una forma de proteccin que
no implique tener que ir revisando lneas de cdigo e ir instalando filtros de forma
manual, como era el caso anterior. Resumiendo, nuestro mtodo de proteccin debe
ser lo ms genrico posible.
Tras analizar la situacin y pensar en diversas soluciones, hemos llegado a la
que creemos una solucin ptima, en cuanto a relacin proteccin conseguida / coste,
y que pasamos a exponer.
Recordemos que, normalmente, una auditora de seguridad se mide en funcin del tiempo empleado
en ella: cuanto ms tiempo emplee el auditor, ms nos cobrar ste.
Pg. 111
Pg. 112
filtros a todas y cada una de ellas. De esta forma, nos aseguramos de que toda
variable ser filtrada, sin excepcin7. A cada variable se le aplican dos filtros, en un
orden estricto.
En primer lugar, aplicamos la funcin htmlentities(), que se encargar de
transformar ciertos caracteres que tienen un significado especial para el lenguaje
HTML, en cadenas inocuas. Este primer filtro evitar que un atacante pueda inyectar
cdigo HTML (o JavaScript), o dicho de otra forma, nos proteger ante ataques de
tipo Cross Site Scripting.
El segundo filtro que aplicamos se corresponde con la funcin
addslashes(). Su finalidad es escapar algunos caracteres especiales como las
comillas. Constituye pues una proteccin vlida contra ataques de tipo SQL inject.
Nuestra funcin sanitizadora hace alguna comprobacin ms. En particular,
chequea la opcin magic_quotes de PHP, y si se encuentra activada, obvia el
segundo filtro, ya que en esencia, tienen la misma funcionalidad y sera redundante
aplicar dos veces un mismo tipo de filtrado (de hecho, obtendramos un efecto
negativo: los caracteres \ aadidos gracias a la primera operacin de escape,
volveran a ser escapados, obteniendo secuencias como \\, que daran resultados
incoherentes).
La ventaja de esta tcnica es evidente: aade proteccin contra diferentes
ataques de inyeccin, de una forma cmoda, sencilla y rpida, puesto que nos ahorra
tener que auditar cdigo (o al menos, lo podremos hacer con ms agilidad, ya que
podremos obviar el anlisis de diferentes puntos que, gracias a esta nueva tcnica,
habran dejado de ser peligrosos) o tener que crear filtros a medida.
7
Con el mtodo de las expresiones regulares, expuesto en el punto anterior, siempre es posible que
nos olvidemos de aadir algn filtro (puesto que la tarea la realizamos manualmente) y dejemos una
variable crtica desprotegida, en algn punto de la Aplicacin.
Pg. 113
Esta tcnica ha sido creada y diseada expresamente para este Proyecto Fin de
Carrera, aunque la intencin del autor es extrapolar su uso a cualquier otra aplicacin
que podamos realizar en PHP.
Si aplicamos la tcnica tal cual a nuestra Aplicacin, observamos un pequeo
fallo, que no afecta a la seguridad pero puede constituir un problema funcional: se
trata del efecto multiplicativo de los caracteres de escape. ste tiene lugar cuando
una misma variable es filtrada varias veces, y el efecto negativo es el mismo que ya
comentamos en el caso del chequeo de magic_quotes: los caracteres de escape
son a su vez escapados, en sucesivos pasos del filtro. Cundo es una variable
filtrada varias veces? Cmo podemos reproducir el fallo? Significa esto que
nuestra rutina es deficitaria?
Comenzamos respondiendo a la ltima pregunta: no, la rutina no es deficitaria.
El problema radica en la Aplicacin y realmente se da en contadas ocasiones,
concretamente en la herramienta de administracin de usuarios, donde al realizar una
operacin sobre los datos de usuario (aadir, editar, tc.) normalmente se nos pide
confirmacin. La peticin de confirmacin viene acompaada de una impresin en
pantalla de los datos que se desea sean confirmados, los cuales a su vez provienen de
un formulario que se rellen en un paso anterior. El script de confirmacin ha
procedido a filtrar las variables a travs de la rutina genrica y por tanto, en pantalla
se mostrarn los datos escapados (es decir, con caracteres \). El fallo se acenta
si respondemos no a la pregunta de comprobacin. En este caso, volveramos al
formulario anterior pero con la peculiaridad de que los datos han sido escapados
una vez ms: el efecto se ha multiplicado. En definitiva, conforme avanzamos un
paso, los caracteres \ se van multiplicando.
Cmo solucionar el problema anterior? Lo ms lgico es redisear el script
de administracin de usuarios, para que no vaya pasando los datos en sucesivos
pasos, mediante variables POST o GET (en este caso, POST) sino que guardara los
Pg. 114
datos como variables de sesin (es decir, la idea es limitar los puntos de entrada de
datos). Al poder considerarse estas ltimas seguras (no pueden ser modificadas
directamente por el navegador) no hara falta filtrarlas de nuevo en cada script que
haga uso de ellas, y evitaramos filtrar varias veces el contenido de una variable. No
podramos hacer igual si las variables que se pasan son POST o GET, ya que estamos
pasando las variables a travs de un medio inseguro y el atacante podra modificarlas
justo en el paso en que hemos desactivado el filtrado.
Sin embargo, vamos a solucionar el problema de otra forma: retocando nuestra
rutina genrica de filtrado. De esta forma, contaremos con una nueva arma, de cara a
proteger futuras aplicaciones en PHP que puedan verse afectadas por el mismo
problema, sin tener que redisear el cdigo de las mismas.
La nueva rutina ha sido denominada sanitize_vars_fixed(). Mostramos a
continuacin el cdigo de la misma.
*/
}
Figura 4.6. Rutina genrica modificada sanitize_vars_fixed().
Pg. 115
Pg. 116
3.4.
3.4.1. Justificacin.
La herramienta de administracin es un elemento fundamental en el portal, ya
que le confiere la flexibilidad y comodidad que supone el poder actualizar sus
contenidos de una forma simple y ordenada, sin ms ayuda que la de un navegador, o
automatizar ciertos procesos administrativos.
En el caso que nos ocupa, sta se encontraba en un estado rudimentario: no
exista un men de acceso a los scripts de administracin de los distintos servicios
(es decir, no exista la herramienta de administracin como tal sino, por llamarlo de
alguna forma, existan scripts de administracin independientes); adems stos eran
muy bsicos, carecan de ciertas funcionalidades y no estaban demasiado bien
diseados ni programados, y lo ms importante, eran inseguros (recordemos la grave
vulnerabilidad descrita en el captulo 3, mediante la cual un atacante poda ejecutar
estos scripts sin necesidad de conocer la contrasea de administracin). Adems
tenan numerosos fallos estticos y tambin algunos funcionales, que podan surgir
en cualquier momento bajo ciertas condiciones, fruto de la escasa o nula
comprobacin los valores devueltos por algunas funciones. Por ltimo, era necesario
implementar nuevas funcionalidades, como la herramienta de administracin de
usuarios.
En definitiva, una drstica remodelacin se haca totalmente necesaria y as se
ha hecho. Se ha intentado aprovechar cdigo existente pero finalmente la mayor
parte del cdigo ha tenido que ser reescrito desde cero.
Pg. 117
La seguridad no se basa en este hecho, en absoluto. Esta caracterstica est pensada exclusivamente
para agilizar el acceso a las distintas opciones de administracin.
Pg. 118
Pg. 119
Pg. 120
3.5.
Pg. 121
$dbuser_rw = 'csed_admin';
$dbpass_rw = 'B0e8Yt4K';
/* Las distintas bbdd asociadas a cada servicio
*
* (comentar o dejar a '' si el servicio est deshabilitado)
*/
$db_usuarios = 'usuarios_csed';
$db_cuestionario = 'cuestionario_csed';
$db_dudas = 'dudas_csed';
$db_encuesta = 'encuesta_csed';
$db_notas = 'notas_csed';
$db_noticias = 'noticias_csed';
$db_monitores = '';
/* Permisos por defecto para nuevos usuarios creados (si no
se definen sern 0) */
$defperm = array( 'usuarios_list' => 0
, 'usuarios_edit' => 0
, 'usuarios_del' => 0
, 'usuarios_add' => 0
, 'download' => 1
, 'dudas_r' => 1
, 'dudas_w' => 0
, 'encuesta_r' => 1
, 'encuesta_w' => 0
, 'encuesta1' => 0
, 'encuesta2' => 0
, 'encuesta3' => 0
, 'notas_r' => 1
, 'notas_w' => 0
, 'noticias_r' => 1
, 'noticias_w' => 0
, 'cuestionario_r' => 1
, 'cuestionario_w' => 0
, 'monitores_r' => 1
, 'monitores_w' => 0
, 'admin_tool' => 1
, 'chpass' => 1
);
Pg. 122
3.6.
Pg. 123
--databases
-u
root
cuestionario
-p
--opt
dudas
--result-
encuesta
notas
noticias monitores
Enter password: ******
D:\PFC\mysql\bin>
Pg. 124
Pg. 125
Tras la implantacin del nuevo sistema de usuarios, las tablas anteriores han
dejado de ser necesarias y han sido eliminadas de las bases de datos
correspondientes.
Por ltimo, hemos renombrado las tablas del servicio encuesta
correspondientes a los distintos profesores, de forma que la nomenclatura no haga
alusin al nombre de los mismos. As conseguimos una nomenclatura genrica. Las
sentencias SQL empleadas para realizar los cambios han sido:
3.7.
Pg. 126
Pg. 127
encriptacin usados en este campo suelen ser de un solo sentido, esto es, existe una
forma directa y rpida de encriptar pero no de desencriptar9.
La Aplicacin original protega las contraseas almacenadas en base de datos
mediante la forma convencional normalmente usada en MySQL, esto es, con la
funcin password() de MySQL. Con el fin de comprobar la fortaleza de este tipo
de claves llevamos a cabo el siguiente pequeo experimento. Los resultados fueron
sorprendentes.
Comenzamos encriptando tres contraseas sencillas y muy similares:
mysql> select password('a');
+------------------+
| password('a')
|
+------------------+
| 60671c896665c3fa |
+------------------+
1 row in set (0.00 sec)
mysql> select password('b');
+------------------+
| password('b')
|
+------------------+
| 60671ccd6665c43e |
+------------------+
1 row in set (0.00 sec)
mysql> select password('c');
+------------------+
| password('c')
|
+------------------+
| 60671b016665c072 |
+------------------+
1 row in set (0.00 sec)
No quiere decir que no exista realmente forma de desencriptar sino simplemente que el tiempo de
computacin necesario para llevar a cabo esta labor es extremadamente grande, por lo que en la
prctica resulta inviable.
Pg. 128
permanecido invariables. Dicho de otra forma, parece que existe correlacin entre las
distintas contraseas encriptadas, o lo que es lo mismo, parece posible obtener cierta
informacin de la primera contrasea sin encriptar si conocemos de antemano el
segundo y tercer par contrasea en texto plano contrasea cifrada. Este efecto no es
deseable (puede facilitar un ataque de fuerza bruta o de cualquier otro tipo contra una
contrasea encriptada dada).
Sin embargo, fijmosnos en lo siguiente:
mysql> select md5('a');
+----------------------------------+
| md5('a')
|
+----------------------------------+
| 0cc175b9c0f1b6a831c399e269772661 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select md5('b');
+----------------------------------+
| md5('b')
|
+----------------------------------+
| 92eb5ffee6ae2fec3ad71c777531578f |
+----------------------------------+
1 row in set (0.01 sec)
mysql> select md5('c');
+----------------------------------+
| md5('c')
|
+----------------------------------+
| 4a8a08f09d37b73795649038408b5f33 |
+----------------------------------+
1 row in set (0.00 sec)
mysql>
En este caso el grado de entropa es, claramente, mucho mayor. Viendo las
tres contraseas encriptadas no nos podramos figurar que las contraseas originales
(en plano) pudieran ser si quiera parecidas (como de hecho lo son).
La funcin md5() ha demostrado ser ms robusta (no slo por el
experimento realizado sino adems por otros factores, como una mayor longitud de
Pg. 129
la contrasea encriptada, o sin ir ms lejos, el amplio uso que todava se hace de este
tipo de firmas digitales en Internet) y por ello, se ha decidido su utilizacin en las
implementaciones llevadas a cabo en nuestra Aplicacin, en lugar de la funcin
password().
Adems, el cifrado MD510 tambin se encuentra implementado en PHP, lo que
da una idea de su importancia.
Existen diferentes alternativas de cifrado que nos podran haber resultado
igualmente vlidas. Por ejemplo, una opcin ms segura que el MD5, y que tambin
est implementada en PHP, es el SHA-111. Sin embargo, en el contexto que nos
ocupa no bamos a notar una mejora de la seguridad apreciable, as que hemos
decidido no implantarlo en nuestra Aplicacin.
3.8.
MD5 Message-Digest Algorithm, de RSA Data Security, Inc. Se trata de una funcin tipo hash
(similar a un checksum) que devuelve un bloque de 128 bits, basado en la entrada recibida. Se usa
comnmente como firma digital.
11
Descrito en el RFC 3174 (Secure Hash Algorithm). Devuelve un bloque de 160 bits.
Pg. 130
modificando
adecuadamente
la
variable
global
Pg. 131
Pg. 132
Pg. 133
@echo off
sed "s/http\:\/\/woody\.us\.es\/fbarrero/http\:\/\/urlwoody/g" %1
> %1.FIX
del %1
move %1.FIX %1
sed "s/http\:\/\/www\.gte\.us\.es\/\~fbarrero/http\:\/\/urlgte/g"
%1 > %1.FIX
del %1
move %1.FIX %1
sed "s/http\:\/\/woody\.us\.es\/~fbarrero/http\:\/\/urlgoody/g" %1
> %1.FIX
del %1
move %1.FIX %1
@echo off
sed "s/http\:\/\/urlwoody/http\:\/\/www\.gte\.us\.es\/fbarrero/g"
%1 > %1.FIX
del %1
move %1.FIX %1
sed "s/http\:\/\/urlgte/http\:\/\/www\.gte\.us\.es\/\~fbarrero/g"
%1 > %1.FIX
del %1
move %1.FIX %1
sed "s/http\:\/\/urlgoody/http\:\/\/www\.gte\.us\.es\/~fbarrero/g"
%1 > %1.FIX
del %1
move %1.FIX %1
Pg. 134
Pg. 135
127.0.0.1
127.0.0.1
127.0.0.1
urlwoody
urlgte
urlgoody
Lo anterior hace que las URLs locales tengan validez, ya que se asignan a la
direccin de loopback. La forma correcta de entrar al portal, en el servidor local, es
mediante:
http://urlgte/CSED/
En la conversin de URLs no hemos tenido en cuenta que en ciertos casos la
web original usa /CSED/ y en otros /csed. Nosotros no lo hemos convertido, lo
hemos dejado tal cual. Funcionar en nuestro servidor local, teniendo en cuenta que
realmente slo existe el directorio fsico /csed (y no /CSED)? La respuesta es s,
porque Windows no es case-sensitive (al contrario que Unix) y por tanto, mapear
tanto /csed como /CSED en el directorio fsico /csed.
Hemos conseguido salvar un importante obstculo con la realizacin de los
archivos de comandos anteriores pero todava queda un ltimo detalle. Cmo
automatizar el proceso para que los filtros anteriores (en realidad slo uno, segn el
sentido de la conversin que se desee) sean aplicados a todos los ficheros del portal?
Habr que ir recorriendo el directorio y hacer a mano rep fichero1, rep fichero2,
etc.?
La respuesta es a la pregunta anterior es negativa, evidentemente. Tambin
hemos automatizado este ltimo paso, y para ello hemos hecho uso de la herramienta
ufind, que es la versin win32 del conocido find de Unix (Windows tambin
dispone de una herramienta find, totalmente diferente, y que no nos ser til; de
ah que hayamos usado el trmino ufind, de Unix find).
La siguiente lnea de comandos barrer todos los ficheros del directorio actual
(y subdirectorios) que pueden contener enlaces (es decir, aquellos con extensin .php
y .html) y le aplicar el filtro rep.bat:
Pg. 136
Por tanto, bastar con situarnos en el directorio raz del portal y ejecutar el
comando anterior, para iniciar el proceso automtico de conversin de URLs. La
conversin inversa se realiza de forma anloga, sustituyendo rep por rep_inv.
4. Mejoras propuestas.
Las siguientes mejoras no han sido implementadas pero consideramos
importante referenciarlas, de cara a futuras lneas de trabajo e investigacin.
Habra que mejorar an ms la flexibilidad y portabilidad de la
Aplicacin, es decir, la facilidad para crear un nuevo portal mediante
clonacin de un portal original que usaramos como modelo. Algunas
de las implementaciones realizadas y presentadas en este Proyecto han
constituido mejoras importantes en este sentido (por ejemplo, la
definicin de variables, como el nombre del portal, en un fichero de
configuracin genrico llamado config.php). Sin embargo, an
queda mucho camino por recorrer. Como mnimo, sera recomendable
definir en alguna funcin o fichero lo que ser mostrado como
cabecera de cualquier script, esto es, la seccin donde actualmente
aparece el ttulo del portal acompaado de un par de logos. De esta
forma, si queremos cambiarla slo tendramos que modificar dicha
funcin, evitando el tener que ir revisando y modificando todos los
ficheros, uno a uno (aparte ahorraramos algo de espacio web).
Pg. 137
12
SSL: Secure Sockets Layer. Protocolo de seguridad cuyo objetivo es dotar de privacidad y
confiabilidad a la comunicacin entre dos aplicaciones. Ver especificaciones en:
http://wp.netscape.com/eng/ssl3/.
Pg. 138
Captulo 5
1. Conclusiones.
Ya en captulos anteriores hemos adelantado algunas conclusiones obtenidas
durante el desarrollo de este trabajo. No obstante, presentaremos a continuacin la
sntesis de los resultados obtenidos y comentaremos todo cuanto estimemos
necesario para una mejor comprensin del proyecto y de los objetivos logrados.
La primera y principal conclusin que extraemos es alarmante: los
programadores de hoy en da todava no estn concienciados ni le
dan la suficiente importancia al tema de la seguridad. Este hecho ha
quedado ms que demostrado con la realizacin de este trabajo. Sin ir
ms lejos, una de las vulnerabilidades que hemos descubierto permita
Pg. 139
Pg. 140
Pg. 141
Pg. 142
Pg. 143
Pg. 144
Pg. 145
pudiera consultar su propia calificacin obtenida en la asignatura, sin tener que mirar
el listado de notas de todos los alumnos (adems, podra ser til en cuanto a la
privacidad se refiere, ya que cada usuario slo podra consulta su propia nota, y no la
de sus compaeros). Tampoco estara mal aadir ciertas funcionalidades de
bsquedas en el portal, tanto en la parte visible a los usuarios, como en la zona
administrativa. Por ejemplo, sera til que desde el administrador de usuarios se
pudiera hacer una bsqueda por nombre de usuario, dando luego la posibilidad de
editarlo o borrarlo.
Respecto a mejoras de seguridad, proponemos el uso de SSL (Secure Sockets
Layer), al menos en las fases ms crticas, como por ejemplo durante la fase de
autentificacin. As evitaramos que las contraseas de nuestros usuarios (y tambin
del propio administrador del portal) viajaran en claro por la red, y pudieran ser
interceptadas mediante sniffing. Lograr esta configuracin no es nada difcil.
Pg. 146
Apndice A
1. Objetivos.
Partiendo del hecho de que muchos agujeros de seguridad provienen no de la
mala calidad del software servidor sino de una mala configuracin por parte de quien
lo administra, estableceremos en este apartado una configuracin por defecto segura,
que pueda ser usada como punto de partida en la instalacin de un entorno similar al
que nos ocupa, por alguien preocupado por la seguridad.
Obtendremos una configuracin robusta, donde:
Las funcionalidades ms peligrosas estn desactivadas por defecto.
Esto implica que el administrador deber ir activando a medida las
funcionalidades que sus usuarios vayan necesitando, siempre en un
ambiente controlado, por lo que el alcance de un posible agujero de
seguridad se ver acotado y limitado. En el caso de Apache, por
Pg. 147
Pg. 148
2. Requisitos.
Describiremos paso a paso el proceso de creacin de un entorno de desarrollo
sobre Windows NT / 2000 (valdr tambin, en general, para cualquier otra versin
de Windows no demasiado arcaica, es decir, Win95, 98 o ME, si bien es posible que
cambie el fichero de setup a ejecutar). Aunque dada la naturaleza del software
servidor que vamos a instalar le ser fcil al lector extrapolar estas instrucciones al
caso Unix. De hecho, el Apache Group lanza la siguiente advertencia: la versin
de Apache de Windows no se considera lo suficientemente rodada como para ser
utilizada en entornos de produccin (si bien, en la prctica, funciona a la perfeccin,
y para entornos de pruebas resulta ms que suficiente). De todas formas, la sintaxis
de los ficheros de configuracin, que es lo que aqu ms importa, es independiente
del sistema operativo, luego las ideas que a continuacin ofreceremos sern de
directa aplicacin en el mundo Unix.
Instalaremos las ltimas versiones disponibles a la hora de escribir estas
lneas, en las ubicaciones siguientes:
Pg. 149
3. Apache.
1) Ejecutamos "apache_1.3.26-win32-x86-no_src.exe" e instalamos la versin arrancable manualmente desde consola (es decir, la que no ejecuta
Apache como NT Service) en d:\pfc\apache.
2) Modificamos d:\pfc\apache\conf\httpd.conf. En particular:
Protegemos un poco el servidor desactivando CGIs, indexing y en
general todo lo que no es necesario.
BindAddress 127.0.0.1 (o la IP que corresponda)
DocumentRoot "D:/PFC/www"
ServerSignature Off
ServerTokens ProductOnly
Para que Apache no visualice ficheros include (.inc):
<Files ~ "\.inc$">
Order allow,deny
Deny from all
Satisfy All
</Files>
3) Para ejecutar el servidor: d:\pfc\apache\apache.exe.
4. PHP.
Pg. 150
Pg. 151
5. MySQL.
11) Descomprimimos "mysql-3.23.43-win.zip" y ejecutamos Setup. Realizaremos la instalacin en d:\pfc\mysql.
12) Ejecutamos "d:\pfc\mysql\bin\winmysqladmin.exe" y creamos un fichero
de configuracin, con opciones por defecto, con usuario "root" y la
contrasea "j0nj0n" (C:\WINNT\my.ini)
13) Modificamos C:\WINNT\my.ini (usando WinMySQLAdmin):
bind-address=127.0.0.1
language=D:/PFC/mysql/share/spanish
14) Creamos un enlace directo a "d:\pfc\mysql\bin\mysqld-nt.exe --console"
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
ServerRoot "D:/PFC/Apache"
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
#
PidFile logs/httpd.pid
#
# ScoreBoardFile: File used to store internal server process information.
Pg. 152
# Not all architectures require this. But if yours does (you'll know because
# this file will be created when you run Apache) then you *must* ensure that
# no two invocations of Apache share the same scoreboard file.
#
ScoreBoardFile logs/apache_runtime_status
#
# In the standard configuration, the server will process httpd.conf (this
# file, specified by the -f command line option), srm.conf, and access.conf
# in that order. The latter two files are now distributed empty, as it is
# recommended that all directives be kept in a single file for simplicity.
# The commented-out values below are the built-in defaults. You can have the
# server ignore these files altogether by using "/dev/null" (for Unix) or
# "nul" (for Win32) for the arguments to the directives.
#
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
#
#
#
#
#
#
#
# MaxRequestsPerChild: the number of requests each child process is
# allowed to process before the child dies. The child will exit so
# as to avoid problems after prolonged use when Apache (and maybe the
# libraries it uses) leak memory or other resources. On most systems, this
# isn't really needed, but a few (such as Solaris) do have notable leaks
# in the libraries. For Win32, set this value to zero (unlimited)
# unless advised otherwise.
#
# NOTE: This value does not include keepalive requests after the initial
#
request per connection. For example, if a child process handles
#
an initial request and 10 subsequent "keptalive" requests, it
#
would only count as 1 request towards this limit.
#
MaxRequestsPerChild 0
#
# Number of concurrent threads (i.e., requests) the server will allow.
# Set this value according to the responsiveness of the server (more
# requests active at once means they're all handled more slowly) and
Pg. 153
Pg. 154
#AddModule mod_vhost_alias.c
AddModule mod_env.c
AddModule mod_log_config.c
#AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
#AddModule mod_status.c
#AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_isapi.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
#AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_alias.c
#AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
#AddModule mod_auth_anon.c
#AddModule mod_auth_dbm.c
#AddModule mod_auth_digest.c
#AddModule mod_digest.c
#AddModule mod_proxy.c
#AddModule mod_cern_meta.c
#AddModule mod_expires.c
#AddModule mod_headers.c
#AddModule mod_usertrack.c
#AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
AddModule mod_php4.c
#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
#ExtendedStatus Off
### Section 2: 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# Port: The port to which the standalone server listens. Certain firewall
# products must be configured before Apache can listen to a specific port.
# Other running httpd servers will also interfere with this port. Disable
# all firewall, security, and other services if you encounter problems.
# To help diagnose problems use the Windows NT command NETSTAT -a
#
Port 80
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents.
#
Pg. 155
ServerAdmin r0man@phreaker.net
#
# ServerName allows you to set a host name which is sent back to clients for
# your server if it's different than the one the program would get (i.e., use
# "www" instead of the host's real name).
#
# Note: You cannot just invent host names and hope they work. The name you
# define here must be a valid DNS name for your host. If you don't understand
# this, ask your network administrator.
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address (e.g., http://123.45.67.89/)
# anyway, and this will make redirections work in a sensible way.
#
# 127.0.0.1 is the TCP/IP local loop-back address, often named localhost. Your
# machine always knows itself by this address. If you use Apache strictly for
# local testing and development, you may use 127.0.0.1 as the server name.
#
ServerName skorpio.llfb.org
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "D:/PFC/www/"
#
# Each directory to which Apache has access, can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# permissions.
#
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#
#
#
#
#
#
Note that from this point forward you must specifically allow
particular features to be enabled - so if something's not working as
you might expect, make sure that you have specifically enabled it
below.
#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "D:/PFC/www">
#
#
#
#
#
#
#
#
#
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#
AllowOverride None
Pg. 156
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
</Directory>
#
# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is received.
#
# Under Win32, we do not currently try to determine the home directory of
# a Windows login, so a format such as that below needs to be used. See
# the UserDir documentation for details.
#
<IfModule mod_userdir.c>
UserDir "D:/PFC/Apache/users/"
</IfModule>
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory "D:/PFC/Apache/users">
#
AllowOverride FileInfo AuthConfig Limit
#
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
<Limit GET POST OPTIONS PROPFIND>
#
Order allow,deny
#
Allow from all
#
</Limit>
#
<LimitExcept GET POST OPTIONS PROPFIND>
#
Order deny,allow
#
Deny from all
#
</LimitExcept>
#</Directory>
#
# DirectoryIndex: Name of the file or files to use as a pre-written HTML
# directory index. Separate multiple entries with spaces.
#
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
#
# AccessFileName: The name of the file to look for in each directory
# for access control information.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess files from being viewed by
# Web clients. Since .htaccess files often contain authorization
# information, access is disallowed for security reasons. Comment
# these lines out if you want Web visitors to see the contents of
# .htaccess files. If you change the AccessFileName directive above,
# be sure to make the corresponding changes here.
#
# Also, folks tend to use names such as .htpasswd for password
# files, so this will protect those as well.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
#
Pg. 157
Pg. 158
HostnameLookups Off
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog logs/error.log
#
# LogLevel: Control the number of messages logged to the error.log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog logs/access.log common
#
# If you would like to have agent and referer logfiles, uncomment the
# following directives.
#
#CustomLog logs/referer.log referer
#CustomLog logs/agent.log agent
#
# If you prefer a single logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog logs/access.log combined
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (error documents, FTP directory listings,
# mod_status and mod_info output etc., but not CGI generated documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature Off
#
#
#
#
#
#
Apache parses all CGI scripts for the shebang line by default.
This comment line, the first line of the script, consists of the symbols
pound (#) and exclamation (!) followed by the path of the program that
can execute this specific script. For a perl script, with perl.exe in
the C:\Program Files\Perl directory, the shebang line should be:
#!c:/program files/perl/perl
# Note you _must_not_ indent the actual shebang line, and it must be the
# first line of the file. Of course, CGI processing must be enabled by
Pg. 159
<Directory "D:/PFC/Apache/icons">
Options Indexes MultiViews
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
# This Alias will project the on-line documentation tree under /manual/
# even if you change the DocumentRoot. Comment it if you don't want to
# provide access to the on-line documentation.
#
Alias /manual/ "D:/PFC/Apache/htdocs/manual/"
<Directory "D:/PFC/Apache/htdocs/manual">
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#
#
#
#
#
#
Pg. 160
# Alias.
#
#ScriptAlias /cgi-bin/ "D:/PFC/Apache/cgi-bin/"
#
# "D:/PFC/Apache/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "D:/PFC/Apache/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
</IfModule>
# End of aliases.
#
#
#
#
#
#
Redirect allows you to tell clients about documents which used to exist in
your server's namespace, but do not anymore. This allows you to tell the
clients where to look for the relocated document.
Format: Redirect old-URI new-URL
#
# Directives controlling the display of server-generated directory listings.
#
<IfModule mod_autoindex.c>
#
# FancyIndexing is whether you want fancy directory indexing or standard
#
# Note, add the option TrackModified to the IndexOptions default list only
# if all indexed directories reside on NTFS volumes. The TrackModified flag
# will report the Last-Modified date to assist caches and proxies to properly
# track directory changes, but it does _not_ work on FAT volumes.
#
IndexOptions FancyIndexing
#
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType
AddIconByType
AddIconByType
AddIconByType
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
AddIcon
(TXT,/icons/text.gif) text/*
(IMG,/icons/image2.gif) image/*
(SND,/icons/sound2.gif) audio/*
(VID,/icons/movie.gif) video/*
Pg. 161
AddIcon
AddIcon
AddIcon
AddIcon
/icons/back.gif ..
/icons/hand.right.gif README
/icons/folder.gif ^^DIRECTORY^^
/icons/blank.gif ^^BLANKICON^^
#
# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
#
DefaultIcon /icons/unknown.gif
#
# AddDescription allows you to place a short description after a file in
# server-generated indexes. These are only displayed for FancyIndexed
# directories.
# Format: AddDescription "description" filename
#
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
#
# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
#
# HeaderName is the name of a file which should be prepended to
# directory indexes.
#
# If MultiViews are amongst the Options in effect, the server will
# first look for name.html and include it if found. If name.html
# doesn't exist, the server will then look for name.txt and include
# it as plaintext if found.
#
ReadmeName README
HeaderName HEADER
#
# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing. Shell-style wildcarding is permitted.
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>
# End of indexing directives.
#
# Document types.
#
<IfModule mod_mime.c>
#
# AddEncoding allows you to have certain browsers (Mosaic/X 2.1+) uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
#
# AddLanguage allows you to specify the language of a document. You can
# then use content negotiation to give a browser a file in a language
# it can understand.
#
# Note 1: The suffix does not have to be the same as the language
# keyword --- those with documents in Polish (whose net-standard
# language code is pl) may wish to use "AddLanguage pl .po" to
# avoid the ambiguity with the common suffix for perl scripts.
#
# Note 2: The example entries below illustrate that in quite
Pg. 162
tw
Pg. 163
Action lets you define media types that will execute a script whenever
a matching file is called. This eliminates the need for repeated URL
pathnames for oft-used CGI file processors.
Format: Action media/type /cgi-script/location
Format: Action handler-name /cgi-script/location
#
# MetaDir: specifies the name of the directory in which Apache can find
# meta information files. These files contain additional HTTP headers
# to include when sending the document
#
#MetaDir .web
#
# MetaSuffix: specifies the file name suffix for the file containing the
# meta information.
#
#MetaSuffix .meta
Pg. 164
#
# Customizable error response (Apache style)
# these come in three flavors
#
#
1) plain text
#ErrorDocument 500 "The server made a boo boo.
# n.b. the single leading (") marks it as text, it does not get output
#
#
2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# N.B.: You can redirect to a script or a document using server-side-includes.
#
#
3) external redirects
#ErrorDocument 402 http://some.other_server.com/subscription_info.html
# N.B.: Many of the environment variables associated with the original
# request will *not* be available to such a script.
#
# Customize behaviour based on the browser
#
<IfModule mod_setenvif.c>
#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to grok a
# basic 1.1 response.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</IfModule>
# End of browser customization directives
#
# Allow server status reports, with the URL of http://servername/server-status
# Change the "kkkk" to match your domain to enable.
#
#<Location /server-status>
#
SetHandler server-status
#
Order deny,allow
#
Deny from all
#
Allow from kkkk
#</Location>
#
# Allow remote server configuration reports, with the URL of
# http://servername/server-info (requires that mod_info.c be loaded).
# Change the "kkkk" to match your domain to enable.
#
#<Location /server-info>
#
SetHandler server-info
#
Order deny,allow
#
Deny from all
#
Allow from kkkk
Pg. 165
#</Location>
#
# There have been reports of people trying to abuse an old bug from pre-1.1
# days. This bug involved a CGI script distributed as a part of Apache.
# By uncommenting these lines you can redirect these attacks to a logging
# script on phf.apache.org. Or, you can record them yourself, using the script
# support/phf_abuse_log.cgi.
#
#<Location /cgi-bin/phf*>
#
Deny from all
#
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#</Location>
#
# Proxy Server directives. Uncomment the following lines to
# enable the proxy server:
#
#<IfModule mod_proxy.c>
#
ProxyRequests On
#
#
#
#
#
<Directory proxy:*>
Order deny,allow
Deny from all
Allow from kkkk
</Directory>
#
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
#
ProxyVia On
#
#
#
#
#
#
#
#
# To enable the cache as well, edit and uncomment the following lines:
# (no cacheing without CacheRoot)
#
CacheRoot "D:/PFC/Apache/proxy"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
NoCache a_domain.com another_domain.edu joes.garage_sale.com
#</IfModule>
# End of proxy directives.
### Section 3: Virtual Hosts
#
# VirtualHost: If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at <URL:http://www.apache.org/docs/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.
#
# Use name-based virtual hosting.
#
#NameVirtualHost *
#
# VirtualHost example:
Pg. 166
Pg. 167
Pg. 168
; you use this feature, and the argument will be passed by value instead of by
; reference).
allow_call_time_pass_reference = Off
;
; Safe Mode
;
safe_mode = On
; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off
; When safe_mode is on, UID/GID checks are bypassed when
; including files from this directory and its subdirectories.
; (directory must also be in include_path or full path must
; be used when including)
safe_mode_include_dir =
; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
safe_mode_exec_dir =
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
;
;open_basedir =
; Setting certain environment variables may be a potential security breach.
; This directive contains a comma-delimited list of prefixes. In Safe Mode,
; the user may only alter environment variables whose names begin with the
; prefixes supplied here. By default, users will only be able to set
; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR).
;
; Note: If this directive is empty, PHP will let the user modify ANY
; environment variable!
safe_mode_allowed_env_vars = PHP_
; This directive contains a comma-delimited list of environment variables that
; the end user won't be able to change using putenv(). These variables will be
; protected even if safe_mode_allowed_env_vars is set to allow to change them.
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
disable_functions =
; Colors for Syntax Highlighting mode.
; <font color="??????"> would work.
highlight.string = #CC0000
highlight.comment = #FF9900
highlight.keyword = #006600
highlight.bg
= #FFFFFF
highlight.default = #0000CC
highlight.html
= #000000
;
; Misc
;
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = Off
Pg. 169
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30
; Maximum execution time of each script, in seconds
memory_limit = 8M
; Maximum amount of memory a script may consume (8MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL
- All errors and warnings
; E_ERROR
- fatal run-time errors
; E_WARNING
- run-time warnings (non-fatal errors)
; E_PARSE
- compile-time parse errors
; E_NOTICE
- run-time notices (these are warnings which often result
;
from a bug in your code, but it's possible that it was
;
intentional (e.g., using an uninitialized variable and
;
relying on the fact it's automatically initialized to an
;
empty string)
; E_CORE_ERROR
- fatal errors that occur during PHP's initial startup
; E_CORE_WARNING
- warnings (non-fatal errors) that occur during PHP's
;
initial startup
; E_COMPILE_ERROR
- fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR
- user-generated error message
; E_USER_WARNING
- user-generated warning message
; E_USER_NOTICE
- user-generated notice message
;
; Examples:
;
;
- Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;
- Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;
- Show all errors
;
error_reporting = E_ALL
; Print out errors (as a part of the output). For production web sites,
; you're strongly encouraged to turn this feature off, and use error logging
; instead (see below). Keeping display_errors enabled on a production web site
; may reveal security information to end users, such as file paths on your Web
; server, your database schema or other information.
display_errors = Off
; Even when display_errors is on, errors that occur during PHP's startup
; sequence are not displayed. It's strongly recommended to keep
; display_startup_errors off, except for when debugging.
display_startup_errors = Off
; Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
log_errors = On
; Store the last error/warning message in $php_errormsg (boolean).
track_errors = Off
; Disable the inclusion of HTML tags in error messages.
;html_errors = Off
Pg. 170
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
Pg. 171
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
; Automatically add files before or after any PHP document.
auto_prepend_file =
auto_append_file =
; As of 4.0b4, PHP always outputs a character encoding by default in
; the Content-type: header. To disable sending of the charset, simply
; set it to be empty.
;
; PHP's built-in default is text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
; Always populate the $HTTP_RAW_POST_DATA variable.
;always_populate_raw_post_data = On
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
doc_root =
; The directory under which PHP opens the script using /~usernamem used only
; if nonempty.
user_dir =
; Directory in which the loadable extensions (modules) reside.
extension_dir = ./
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
enable_dl = On
;
;
;
;
;
; if cgi.force_redirect is turned on, and you are not running under Apache or
Netscape
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
; cgi.redirect_status_env = ;
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
Pg. 172
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M
;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = Off
; Define the anonymous ftp password (your email address)
;from="john@doe.com"
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;
extension=modulename.extension
;
; For example, on Windows:
;
;
extension=msql.dll
;
; ... or under UNIX:
;
;
extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.
;Windows Extensions
;Note that MySQL and ODBC support is now built in, so no dll is needed for it.
;
;extension=php_bz2.dll
;extension=php_ctype.dll
;extension=php_cpdf.dll
;extension=php_curl.dll
;extension=php_cybercash.dll
;extension=php_db.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_dbx.dll
;extension=php_domxml.dll
;extension=php_dotnet.dll
;extension=php_exif.dll
;extension=php_fbsql.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd.dll
;extension=php_gettext.dll
;extension=php_hyperwave.dll
;extension=php_iconv.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
;extension=php_imap.dll
;extension=php_ingres.dll
;extension=php_interbase.dll
;extension=php_java.dll
Pg. 173
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pdf.dll
;extension=php_pgsql.dll
;extension=php_printer.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_sockets.dll
;extension=php_sybase_ct.dll
;extension=php_tokenizer.dll
;extension=php_w32api.dll
;extension=php_xslt.dll
;extension=php_yaz.dll
;extension=php_zlib.dll
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
; Whether or not to define the various syslog variables (e.g. $LOG_PID,
; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In
; runtime, you can define these variables by calling define_syslog_variables().
define_syslog_variables = Off
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
; For Unix only.
;sendmail_path =
[Java]
;java.class.path = .\php_java.jar
;java.home = c:\jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path = .\
[SQL]
sql.safe_mode = Off
[ODBC]
;odbc.default_db
;odbc.default_user
;odbc.default_pw
=
=
=
-1 means no limit.
-1 means no limit.
Pg. 174
0 means
-1 means no limit.
-1 means no limit.
-1 means no limit.
-1 means no limit.
[PostgresSQL]
; Allow or prevent persistent links.
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect(). Need a little overhead.
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links.
pgsql.max_persistent = -1
-1 means no limit.
-1 means no limit.
[Sybase]
; Allow or prevent persistent links.
sybase.allow_persistent = On
Pg. 175
-1 means no limit.
-1 means no limit.
;sybase.interface_file = "/usr/sybase/interfaces"
; Minimum error severity to display.
sybase.min_error_severity = 10
; Minimum message severity to display.
sybase.min_message_severity = 10
; Compatability mode with old versions of PHP 3.0.
; If on, this will cause PHP to automatically assign types to results according
; to their Sybase type, instead of treating them all as strings. This
; compatability mode will probably not stay around forever, so try applying
; whatever necessary changes to your code, and turn it off.
sybase.compatability_mode = Off
[Sybase-CT]
; Allow or prevent persistent links.
sybct.allow_persistent = On
; Maximum number of persistent links.
sybct.max_persistent = -1
-1 means no limit.
-1 means no limit.
-1 means no limit.
-1 means no limit.
; If on, select statements return the contents of a text blob instead of its id.
ifx.textasvarchar = 0
; If on, select statements return the contents of a byte blob instead of its id.
ifx.byteasvarchar = 0
Pg. 176
; If on, the contents of text and byte blobs are dumped to a file instead of
; keeping them in memory.
ifx.blobinfile = 0
; NULL's are returned as empty strings, unless this is set to 1.
; NULL's are returned as string 'NULL'.
ifx.nullformat = 0
In that case,
[Session]
; Handler used to store/retrieve data.
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
session.save_path = "C:\DOCUME~1\ADMINI~1\CONFIG~1\Temp"
; Whether to use cookies.
session.use_cookies = 1
; Name of the session (used as cookie name).
session.name = PHPSESSID
; Initialize session on request startup.
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0
; The path for which the cookie is valid.
session.cookie_path = /
; The domain for which the cookie is valid.
session.cookie_domain =
; Handler used to serialize data.
session.serialize_handler = php
Pg. 177
-1 means no limit.
-1 means no limit.
Default = 4096.
Default = 4096.
[Assertion]
; Assert(expr); active by default.
;assert.active = On
; Issue a PHP warning for each failed assertion.
;assert.warning = On
; Don't bail out by default.
;assert.bail = Off
; User-function to be called if an assertion fails.
;assert.callback = 0
; Eval the expression with current error_reporting().
; error_reporting(0) around the eval().
;assert.quiet_eval = 0
[Ingres II]
; Allow or prevent persistent links.
ingres.allow_persistent = On
; Maximum number of persistent links.
ingres.max_persistent = -1
-1 means no limit.
-1 means no limit.
Pg. 178
; Default password.
ingres.default_password =
[Verisign Payflow Pro]
; Default Payflow Pro server.
pfpro.defaulthost = "test-payflow.verisign.com"
; Default port to connect to.
pfpro.defaultport = 443
; Default timeout in seconds.
pfpro.defaulttimeout = 30
; Default proxy IP address (if required).
;pfpro.proxyaddress =
; Default proxy port.
;pfpro.proxyport =
; Default proxy logon.
;pfpro.proxylogon =
; Default proxy password.
;pfpro.proxypassword =
[Sockets]
; Use the system read() function instead of the php_read() wrapper.
sockets.use_system_read = On
[com]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
;com.typelib_file =
; allow Distributed-COM calls
;com.allow_dcom = true
; autoregister constants of a components typlib on com_load()
;com.autoregister_typelib = true
; register constants casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constat registrations
;com.autoregister_verbose = true
[Printer]
;printer.default_printer = ""
[mbstring]
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
[FrontBase]
;fbsql.allow_persistent = On
;fbsql.autocommit = On
;fbsql.default_database =
;fbsql.default_database_password =
;fbsql.default_host =
;fbsql.default_password =
;fbsql.default_user = "_SYSTEM"
;fbsql.generate_warnings = Off
;fbsql.max_connections = 128
;fbsql.max_links = 128
;fbsql.max_persistent = -1
;fbsql.max_results = 128
;fbsql.batchSize = 1000
; Local Variables:
; tab-width: 4
; End:
Pg. 179
Pg. 180
Apndice B
1. Introduccin.
El objetivo de este apndice es mostrar ciertos aspectos bsicos -y a la vez
muy importantes- de la administracin y seguridad de un servidor MySQL y sus
bases de datos asociadas: desde cmo establecer o cambiar la contrasea del
administrador hasta una breve descripcin del sistema de privilegios usado en
MySQL para el control de acceso a las distintas bases de datos, sin olvidar el proceso
de creacin de copias de seguridad, tan importante en futuras labores de rescate.
Se presupone que el lector tiene unos conocimientos mnimos del lenguaje
SQL (bsicamente conocer el funcionamiento de algunas sentencias simples de tipo
select, insert, update o delete).
Pg. 181
Pg. 182
3.1. mysqladmin
La distribucin de MySQL incluye, aparte del software servidor propiamente
dicho, diferentes programas y utilidades que permitirn o facilitarn la administracin y mantenimiento tanto del servidor en s como de las bases de datos
albergadas en l.
Uno de estos programas es mysqladmin. Para hacernos una idea de la
funcionalidad que provee este programa bastar con mostrar un resumen de la
sintaxis que soporta as como las opciones disponibles:
D:\PFC\mysql\bin>mysqladmin --help
mysqladmin Ver 8.23 Distrib 3.23.52, for Win95/Win98 on i32
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....
-#, --debug=...
-f, --force
Pg. 183
-v, --verbose
-V, --version
-w, --wait[=retries]
Default options are read from the following files in the given order:
C:\WINNT\my.ini C:\my.cnf
The following groups are read: mysqladmin client
The following options may be given as the first argument:
--print-defaults
Print the program argument list and exit
--no-defaults
Don't read default options from any options file
--defaults-file=#
Only read default options from the given file #
--defaults-extra-file=# Read this file after the global files are read
Possible variables for option --set-variable (-O) are:
connect_timeout
current value: 0
shutdown_timeout
current value: 3600
Where command is a one or more of: (Commands may be shortened)
create databasename
Create a new database
drop databasename
Delete a database and all its tables
extended-status
Gives an extended status message from the server
flush-hosts
Flush all cached hosts
flush-logs
Flush all logs
flush-status
Clear status variables
flush-tables
Flush all tables
flush-threads
Flush the thread cache
flush-privileges
Reload grant tables (same as reload)
kill id,id,...
Kill mysql threads
password new-password Change old password to new-password
ping
Check if mysqld is alive
processlist
Show list of active threads in server
reload
Reload grant tables
refresh
Flush all tables and close and open logfiles
shutdown
Take server down
status
Gives a short status message from the server
start-slave
Start slave
stop-slave
Stop slave
variables
Prints variables available
version
Get version info from server
D:\PFC\mysql\bin>
Cada uno de los comandos que aparecen listados representa una funcionalidad. Usando mysqladmin podemos arrancar o parar el servidor, listar la versin
de software, crear o eliminar una base de datos, etc.
Veamos un par de ejemplos:
D:\PFC\mysql\bin>mysqladmin -u root -p version
Enter password: ******
mysqladmin Ver 8.23 Distrib 3.23.52, for Win95/Win98 on i32
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Server version
Protocol version
Connection
TCP port
3.23.52-nt
10
localhost via TCP/IP
3306
Pg. 184
Uptime:
Opens: 6
Flush tables: 1
Open
Pg. 185
3.2. mysql
Ser la principal herramienta que usaremos para gestionar las distintas bases
de datos. Es la interfaz por excelencia para la administracin y mantenimiento del
servidor MySQL.
La sintaxis general es:
prompt_de_sistema> mysql [opciones] [base de datos]
Por ejemplo:
D:\PFC\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9 to server version: 3.23.52-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Pg. 186
4.
comentamos que se agrupaban bajo una misma base de datos llamada mysql.
Para gestionar los diferentes permisos habremos de introducir modificaciones
en dicha base de datos. Puesto que se trata de una base de datos ms, MySQL puede
trabajar con ella como si de una base de datos normal se tratase: es decir,
podremos utilizar diferentes sentencias SQL (insert, update, delete) para
aadir, actualizar o borrar entradas (permisos). Sin embargo, este mtodo resulta
obsoleto.
MySQL introduce un segundo mtodo para gestionar los permisos, que es el
recomendado, basado en el uso de dos comandos especiales: grant y revoke.
Ser ste el mtodo que emplearemos y estudiaremos a continuacin.
Pg. 187
Ahora le damos permisos sobre la base de datos miempresa, para que pueda
consultar datos, aadir, actualizar o borrar:
mysql>GRANT SELECT, INSERT, UPDATE, DELETE
->ON miempresa.* TO miempresaAdmin@localhost;
En la figura siguiente podemos consultar todos los privilegios que pueden ser
asignados haciendo uso de los comandos grant y revoke:
ALL
FILE
PRIVILEGES
RELOAD
ALTER
INDEX
SELECT
CREATE
INSERT
SHUTDOWN
DELETE
PROCESS
UPDATE
Pg. 188
DROP
REFERENCES USAGE
Si todo ha ido bien, la sentencia select mostrar, entre otras cosas, una
nueva fila (en la tabla db) que fue aadida como consecuencia del comando
grant anterior, y cuyos campos select, insert, update y delete contienen
un valor Y (=yes).
Los dos comandos grant anteriores se podran haber fundido en uno slo,
que sera el encargado tanto de crear el nuevo usuario como de asignarle los
permisos correspondientes, de una forma compacta:
mysql>GRANT SELECT, INSERT, UPDATE, DELETE
->ON miempresa.* TO miempresaAdmin@localhost
->IDENTIFIED BY 'miclave';
Siguiendo con los ejemplos del apartado anterior, veamos cmo quitarle al
usuario miempresaAdmin el permiso de borrado sobre la base de datos
miempresa, que se le concedi anteriormente (con el comando grant
correspondiente):
Pg. 189
5.
Pg. 190
servidor destino podr ser tambin MySQL o no (otras opciones vlidas son Oracle,
Microsoft SQL Server, Informix, etc).
Aunque hay distintas opciones que permiten realizar un backup (la ms rpida
y eficiente es, quizs, usar mysqlhotcopy, que realiza copias en binario, con la
restriccin de que las bases de datos deben residir en la misma mquina en la cual se
ejecuta la utilidad de backup) la forma preferida por nosotros es hacer uso de la
utilidad mysqldump, debido a su flexibilidad y portabilidad (permite migrar bases
de datos a diferentes arquitecturas / servidores). Adems no tiene la restriccin de
mysqlhotcopy: podremos realizar backups en remoto.
Para ello, mysqldump hace uso del lenguaje SQL. Genera ficheros de texto
(de ah su portabilidad, eso s a costa de perder algo de eficiencia) con sentencias
SQL, que luego habrn de ser importadas desde el servidor destino. Estos ficheros de
texto SQL contienen sentencias de creacin de tablas, insercin de nuevas entradas,
etc. Como SQL es un estndar y lo entienden la mayora de servidores de bases de
datos, se hace posible la migracin de bases de datos mediante el mtodo comentado.
Para ilustrar los conceptos ms importantes vamos a estudiar la sintaxis a
emplear en algunos escenarios comunes. Comenzamos con algo tan simple como
obtener una copia de seguridad de una base de datos llamada bbdd:
%>mysqldump [options] bbdd
Pg. 191
Por ltimo, recordar que para bases de datos muy grandes puede ser necesario
(en trminos de velocidad y rendimiento) obtener copias de seguridad binarias.
Esto lo llevaramos a cabo con un script en perl llamado mysqlhotcopy. La
limitacin es que las bases de datos a guardar deben residir en la misma mquina
donde ejecutamos dicho script.
Ilustrmoslo. El primer ejemplo crear un backup (binario) de la base de
datos miempresa, y lo guardar en el directorio /usr/mysql/backups:
%>mysqlhotcopy -u root -p miempresa /usr/mysql/backups
Pg. 192
productos 2002, etc), la forma de obtener una copia de seguridad de todas las
tablas correspondientes al ao 2002, de la base de datos miempresa, sera:
%>mysqlhotcopy -u root -p miempresa./^.+(2002)$/ /usr/mysql/backups
6.
Conclusiones.
Pg. 193
Apndice C
1. Introduccin.
Presentamos a continuacin el exploit realizado como prueba de concepto
correspondiente a la vulnerabilidad descrita en el apartado 3.2.2.1 Validacin de
entrada de usuario insuficiente en la herramienta de administracin.
Pg. 194
Pg. 195
3. Exploit.
<html>
<head><title>Xploit para aadir duda</title></head>
<body>
<h1>Xploit-FAQ by RoMaNSoFt. 2002.08.29</h1><br>
<form action=http://woody.us.es/fbarrero/lie/admin/insertar_duda.php
method=post>
<table width="90%" align="center" cellpadding=1 cellspacing=2>
<tr><td bgcolor=#007f40>
<table width=100%
align="center" background="fondo.gif">
<tr><td colspan=2><p class=t1>Introduce la
pregunta y la
name="permiso" value=1></td></tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
Pg. 196
Apndice D
1. Introduccin.
Retina es el nombre de un producto comercial de la empresa de seguridad
eEye Digital Security. Se trata de un escner de seguridad, es decir, una
herramienta diseada para probar la seguridad de una mquina o incluso toda una
red. El escner se encarga de explorar el objetivo u objetivos en busca de
vulnerabilidades conocidas. Para ello, usa diferentes tcnicas: desde ataques pasivos
(como por ejemplo, consultar el banner que suele mostrar el software servidor
cuando nos conectamos a un determinado servicio, y comparar la versin obtenida
con las versiones que se sabe son vulnerables) a ataques ms agresivos o activos,
algunos de los cuales intentan explotar la vulnerabilidad encontrada (lo cual es a
veces desaconsejable, sobre todo para mquinas que se encuentran en produccin,
debido a que puede producir efectos no deseados, como por ejemplo un D.o.S., sobre
los servicios que estn siendo auditados).
Pg. 197
Confidential Information
The following report contains confidential information, do not distribute, email, fax or transfer
via any electronic mechanism unless it has been approved by our security policy. All copies
and backups of this document should be saved on protected storage at all times. Do not
share any of the information contained within this report with anyone unless they are
authorized to view the information. Violating any of the previous instructions is ground for
termination.
Pg. 198
Table of Contents
Executive Summary
Vulnerability Summary
Address 193.147.161.237
General
Audits
Machine
Port
Services
Glossary of Terms
Executive Summary
1-1
2-1
3-1
3-2
3-3
3-4
3-5
3-6
4-1
1-1
Pg. 199
Pg. 200
Vulnerability Summary
2-1
Introduction
This report was generated on 06/11/2002 17:24:53. Network security scan was performed
using the default security policy. Security audits in this report are not conclusive and to be
used only as reference, physical security to the network should be examined also. All audits
outlined in this report where performed using Retina - The Network Security Scanner,
Version 4.8.37
Audits
Audits in Retina the Network Security Scanner are categorized into different sections. The
sections are based on the type of services you might be running on your servers and / or
workstations.
Total Vulnerabilities By Risk Level
The following graph illustrates the
total number of vulnerabilities across
all machines divided by risk level.
Pg. 201
Pg. 202
Total Vulnerabilities By
Miscellaneous Audit
The following graph illustrates the
total number of Miscellaneous
vulnerabilities across all machines
divided by risk level.
Pg. 203
Address 193.147.161.237
3-1
General: 193.147.161.237
Address: 193.147.161.237
No More Details Available
Report Date: 11/06/02 16:40:29PM
No More Details Available
Audits: 193.147.161.237
Pg. 204
Pg. 205
Pg. 206
BugtraqID: 1480
CHAM-FTP: T:Overflow,C:XCWD,S:5001,P:21
Risk Level: High
Description: CHAMFtp has found that the remote system may be
vulnerable to one or more remote buffer overflow attacks.
How To Fix:
Take a screen shot of Retina and email it to cham@eeye.com so that
we can contact the software vendor and work with them to create a
Pg. 207
fix. If possible, select the Create Log option under Retina's Tools>options menu. Rerun retina against this host (after starting the ftp
server on the remote machine). This creates a log in your top retina
directory call RETDEBUG.LOG. This log will better help us diagnose
the problem in the ftp server.
CVE: GENERIC-MAP-NOMATCH
Pg. 208
Pg. 209
Machine: 193.147.161.237
Open Ports: 15
No More Details Available
Ports: 193.147.161.237
9: DISCARD - Discard
Port State: Open
Pg. 210
Pg. 211
Services: 193.147.161.237
bwnfsd: bwnfsd
Port: 716
Port: 718
Protocol: TCP
Protocol: UDP
Version: 1
Error.:
Port: 67584
Protocol: UDP
Version: 1936027252
Pg. 212
Port: 111
Protocol: TCP
Protocol: UDP
Version: 2
status: status
Port: 1024
Port: 1027
Protocol: TCP
Protocol: UDP
Version: 1
Glossary
4-1
DoS Attack: A Denial of Service (DoS) attack is a remote attack against a servers
TCP/IP stack or services. DoS attacks can saturate a servers bandwidth, saturate all
available connections for a particular service, or even crash a server.
Exploit: A script or program that takes advantage of vulnerabilities in services or
programs to allow an attacker to gain unauthorized or elevated system access.
Host: A node on a network. Usually refers to a computer or device on a network
which both initiates and accepts network connections.
IP Address: The 32-bit address defined by the Internet Protocol in STD 5, RFC 791.
It is usually represented in dotted decimal notation. Any device connected to the
Internet that used TCP/IP is assigned an IP Address. An IP Address can be likened to
a home address in that no two are alike.
Pg. 213
Netbios: Network Basic Input Output System. The standard interface to networks on
IBM PC and compatible networks.
Ping: A program used to test reachability of destination nodes by sending them an
ICMP echo request and waiting for a reply.
Port: A port in the network sense is the pathway that a computer uses to transmit and
receive data. As an example, Web Servers typically listen for requests on port 80.
Registry: The internal system configuration that a user can customize to alter his
computing environment on the Microsoft Windows Platform. The registry is
organized in a hierarchical structure of subtrees and their respective keys, subkeys,
and values that apply to those keys and subkeys
Service: A service is a program running on a remote machine that in one way or
another provides a service to users. For example, when you visit a website the remote
server displays a web page via its web server service.
Share: A folder, set of files, or even a hard drive partition set up on a machine to
allow access to other users. Shares are frequently set up with incorrect file
permissions which could allow an attacker to gain access to this data.
Sniffer: frequently attackers will place a sniffer program on a compromised
machine. The sole purpose of a sniffer is to collect data being transmitted on the
network in clear-text including usernames and passwords.
Subnet: A portion of a network, which may be a physically independent network
segment, which shares a network address with other portions of the network and is
distinguished by a subnet number.
Vulnerability: A weakness or a flaw in a program or service that can allow an
attacker to gain unauthorized or elevated system access.
END OF REPORT
Pg. 214
Apndice E
1. Introduccin.
La base de datos original ha sufrido numerosas modificaciones. Muchas de
las mismas han sido enumeradas a lo largo de esta documentacin. Expondremos a
continuacin el volcado (dump) de la actual base de datos, correspondiente al
portal CSED. La base de datos de LIE es similar y por esa razn hemos decidido
no incluirla aqu (resultara redundante y alargara innecesariamente este apndice).
Pg. 215
Pg. 216
Pg. 217
Pg. 218
Pg. 219
Pg. 220
Pg. 221
Pg. 222
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
Pg. 223
pregunta3 enum('1','2','3','4','5')
pregunta4 enum('1','2','3','4','5')
pregunta5 enum('1','2','3','4','5')
pregunta6 enum('1','2','3','4','5')
pregunta7 enum('1','2','3','4','5')
pregunta8 enum('1','2','3','4','5')
PRIMARY KEY (id)
) TYPE=MyISAM;
default
default
default
default
default
default
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
Pg. 224
Pg. 225
default
default
default
default
default
default
default
default
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
Pg. 226
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
Pg. 227
pregunta20 enum('1','2','3','4','5')
pregunta21 enum('1','2','3','4','5')
pregunta22 enum('1','2','3','4','5')
pregunta23 enum('1','2','3','4','5')
pregunta24 enum('1','2','3','4','5')
fecha date default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
default
default
default
default
default
NULL,
NULL,
NULL,
NULL,
NULL,
Pg. 228
Pg. 229
Pg. 230
noticia text,
comentario text,
fecha date default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
/*!40000 ALTER TABLE noticias DISABLE KEYS */;
--- Dumping data for table 'noticias'
-LOCK TABLES noticias WRITE;
INSERT INTO noticias VALUES (4,'Grupos que trabajarn con el
simulador WinSim','Los grupos 4 y 6 trabajarn con el simulador
WinSim, en lugar de utilizar el de Texas Instruments.','2002-0313'),(7,'Comienzo del Bloque 3 de prcticas','El prximo viernes 26
de abril, se impartir el seminario correspondiente al bloque 3 de
las prcticas en el aula 310. Se celebrarn 3 seminarios en horarios
de 8:30 a 10:30, de 10:30 a 12:30 y de 12:30 a 14:30.','2002-0423'),(6,'Recordatorio del horario de prcticas','Grupo 1: Viernes 22
de marzo de 10:00 a 12:00. Grupo 2: Viernes 22 de marzo de 12:00 a
14:00. Grupo 3: Lunes 1 de abril de 10:00 a 12:00. Grupo 4: Lunes 1
de abril de 12:00 a 14:00. Grupo 5: Viernes 5 de abril de 10:00 a
12:00. Grupo 6: Viernes 5 de abril de 12:00 a 14:00. Grupo 7: Lunes
8 de abril de 10:00 a 12:00. Grupo 8: Lunes 8 de abril de 12:00 a
14:00. Grupo 9: Viernes 12 de abril de 10:00 a 12:00. Grupo 10:
Viernes 12 de abril de 12:00 a 14:00.','2002-03-13'),(8,'Novedad!:
Disponibles problemas resueltos de exmenes de la asignatura','En
formato pdf y versin preliminar (sin depurar). Aquellas personas
interesadas debern ponerse en contacto, va email, con Federico
Barrero y debern comprometerse a la depuracin de los mismos para
su aprovechamiento en cursos posteriores.','2002-04-23');
/*!40000 ALTER TABLE noticias ENABLE KEYS */;
UNLOCK TABLES;
--- Current Database: usuarios_csed
-CREATE DATABASE /*!32312 IF NOT EXISTS*/ usuarios_csed;
USE usuarios_csed;
--- Table structure for table 'cuentas'
-DROP TABLE IF EXISTS cuentas;
CREATE TABLE cuentas (
user varchar(16) NOT NULL default '',
pass varchar(32) NOT NULL default '',
realname varchar(50) default NULL,
Pg. 231
Pg. 232
Pg. 233
Apndice F
1. Introduccin.
El presente proyecto ha implicado el desarrollo de cdigo PHP y HTML para
dos portales diferentes: CSED y LIE. Slo incluiremos en este apndice cdigo
relacionado con el primero de ellos. Se sobreentiende que el segundo portal ha sido
implementado de manera similar.
2. Cdigo.
2.1.
/config/config.php
<?php
// Este archivo ser cargado dinmicamente mediante require() desde distintos
scripts.
// Ser el encargado de mantener toda la configuracin del portal y algunas
funciones
// importantes que sern frecuentemente utilizadas.
Pg. 234
// *****************
// * CONFIGURACION *
// *****************
/* Identificador de portal */
$portal = 'csed';
$nombre_portal = 'Complementos de sistemas electrnicos digitales';
/* E-Mail del Webmaster */
$webmaster = 'fbarrero@gte.esi.us.es';
/* Profesores (encuesta de calidad) */
$profesor1 = 'Federico';
$profesor2 = 'Sergio';
$profesor3 = 'Juan Antonio';
/* Color principal de fondo */
$colorbg='#99cccc';
/* Si lo siguiente est a 0 las notas se leern del archivo "notas_np.php" */
$notas_publicadas = 1;
/* Host donde reside la bbdd */
$dbhost = 'localhost';
/* Usuario de slo lectura para la bbdd */
$dbuser_ro = 'csed';
$dbpass_ro = 'MQVbnSBT';
/* Usuario privilegiado para la bbdd */
$dbuser_rw = 'csed_admin';
$dbpass_rw = 'B0e8Yt4K';
/* Las distintas bbdd asociadas a cada servicio
*
* (comentar o dejar a '' si el servicio est deshabilitado) */
$db_usuarios = 'usuarios_csed';
$db_cuestionario = 'cuestionario_csed';
$db_dudas = 'dudas_csed';
$db_encuesta = 'encuesta_csed';
$db_notas = 'notas_csed';
$db_noticias = 'noticias_csed';
$db_monitores = '';
/* Permisos por defecto para nuevos usuarios creados (si no se definen sern 0) */
$defperm = array( 'usuarios_list' => 0
, 'usuarios_edit' => 0
, 'usuarios_del' => 0
, 'usuarios_add' => 0
, 'download' => 1
, 'dudas_r' => 1
, 'dudas_w' => 0
, 'encuesta_r' => 1
, 'encuesta_w' => 0
, 'encuesta1' => 0
, 'encuesta2' => 0
, 'encuesta3' => 0
, 'notas_r' => 1
, 'notas_w' => 0
, 'noticias_r' => 1
, 'noticias_w' => 0
, 'cuestionario_r' => 1
, 'cuestionario_w' => 0
, 'monitores_r' => 1
, 'monitores_w' => 0
, 'admin_tool' => 1
, 'chpass' => 1
);
Pg. 235
// *************
// * Funciones *
// *************
/* Sanitized Vars Routine by RoMaNSoFt (r0man@phreaker.net) */
function sanitize_vars() {
$magic_quotes = get_magic_quotes_gpc();
foreach ($GLOBALS as $var => $value) {
if (is_array($value)) {
foreach ($value as $i => $j) {
if ($magic_quotes)
$GLOBALS[$var][$i] = htmlentities($j);
else
$GLOBALS[$var][$i] = addslashes(htmlentities($j, ENT_NOQUOTES));
}
} else {
if ($magic_quotes)
$GLOBALS[$var] = htmlentities($value);
else
$GLOBALS[$var] = addslashes(htmlentities($value, ENT_NOQUOTES));
}
}
}
/* (Optimized) Sanitized Vars Routine by RoMaNSoFt (r0man@phreaker.net) */
function sanitize_vars_opt() {
$magic_quotes = get_magic_quotes_gpc();
if ($magic_quotes) {
foreach ($GLOBALS as $var => $value) {
if (is_array($value)) {
foreach ($value as $i => $j) {
$GLOBALS[$var][$i] = htmlentities($j);
}
} else {
$GLOBALS[$var] = htmlentities($value);
}
}
} else {
foreach ($GLOBALS as $var => $value) {
if (is_array($value)) {
foreach ($value as $i => $j) {
$GLOBALS[$var][$i] = addslashes(htmlentities($j, ENT_NOQUOTES));
}
} else {
$GLOBALS[$var] = addslashes(htmlentities($value, ENT_NOQUOTES));
}
}
}
}
/* F-I-X-E-D Sanitized Vars Routine by RoMaNSoFt (r0man@phreaker.net) */
function sanitize_vars_fixed() {
foreach ($GLOBALS as $var => $value) {
if (is_array($value)) {
foreach ($value as $i => $j) {
Pg. 236
}
} else {
$value = preg_replace("/\\\\/", "", $value);
$GLOBALS[$var] = addslashes(htmlentities($value, ENT_QUOTES));
}
}
}
/* Conecta a la bbdd con privilegios de slo lectura */
function conectar() {
global $dbhost, $dbuser_ro, $dbpass_ro;
$dbi = mysql_connect($dbhost, $dbuser_ro, $dbpass_ro);
if ( ! $dbi) {
include ("../msg/err_db_connection.html");
exit;
}
}
return $dbi;
Pg. 237
2.2.
/download/index.php
<?php
require('../config/config.php');
check_privs('download');
function download($fichero, $nombrefich) {
$image_size = filesize ($fichero);
if ($image_size) {
header ("Accept-Ranges: bytes");
header ("Content-Length: $image_size");
header ("Content-Type: application/octet-stream");
header ("Content-Disposition-type: attachment");
header ("Content-Disposition: attachment; filename=\"$nombrefich\"");
readfile ($fichero);
} else {
echo "Fichero no encontrado";
}
Pg. 238
}
if (isset($id)) {
switch($id) {
case "1":
download("ficheros/tema1.pdf", "tema1.pdf");
break;
case "2":
download("ficheros/tema2.pdf", "tema2.pdf");
break;
case "3":
download("ficheros/tema3.pdf", "tema3.pdf");
break;
case "4":
download("ficheros/tema4.pdf", "tema4.pdf");
break;
case "5":
download("ficheros/problemasresueltos.pdf", "problemasresueltos.pdf");
break;
default:
echo "Opcion incorrecta";
exit;
}
else {
include "apuntes.html";
}
?>
2.3.
/admin/acceso_cuestionario.php
<?php
require('../config/config.php');
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
p.t3 {font: bold 14px Verdana, Arial; line-height:18px; color:#006655; TEXTDECORATION: none;text-indent:2px}
font.t1 {font: 13px Verdana, Arial; line-height:18px; color:#007f40; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
Pg. 239
Pg. 240
Pg. 241
2.4.
/admin/acceso_dudas.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
p.t3 {font: bold 14px Verdana, Arial; line-height:18px; color:#006655; TEXTDECORATION: none;text-indent:2px}
font.t1 {font: 13px Verdana, Arial; line-height:18px; color:#007f40; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
/***************************/
/* PROGRAMA: acceso.php
*/
/***************************/
/***********************************/
/* Conectamos con la base de datos */
/***********************************/
$base = $db_dudas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
Pg. 242
Pg. 243
2.5.
/admin/acceso_encuesta.php
<?php
require('../config/config.php');
check_privs('encuesta_w');
?>
<html>
<head>
Pg. 244
Pg. 245
<p class=t2>
<input TYPE="radio" align="right" NAME="prof" VALUE="1" checked>
<?php echo $profesor1 ?>.</p>
</td>
</tr>
<tr>
<td height="23" valign="top" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="prof" VALUE="2">
<?php echo $profesor2 ?>.</p>
</td>
</tr>
<tr>
<td height="23" width="313" valign="top"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="prof" VALUE="3">
<?php echo $profesor3 ?>.</p>
</td>
</tr>
<tr>
<td colspan=2 height="37"> </td>
</tr>
<tr>
<td colspan=2 height="37">
<p align="center">
<input type=submit value=Seguir>
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<?php
}
else if ($elecion=="2"){
/********************************************/
/** Borrar encuestas para un profesor dado **/
/********************************************/
?>
<form action="borrar_encuesta_prof.php" method=post >
<table width="90%" align="center" cellpadding=1 cellspacing=2 bgcolor="#99CCAF">
<tr><td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td colspan=2 height="32">
<p class=t1>
Por favor, seleccione el profesor:</p>
</td>
</tr>
<tr>
<td colspan=2 height="23"> </td>
</tr>
<tr>
<td valign="top" height="23" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="prof" VALUE="1" checked>
<?php echo $profesor1 ?>.</p>
</td>
</tr>
<tr>
Pg. 246
2.6.
/admin/acceso_monitores.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
Pg. 247
<head>
<title>Acceso a la base de datos: monitores</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
p.t3 {font: bold 14px Verdana, Arial; line-height:18px; color:#006655; TEXTDECORATION: none;text-indent:2px}
font.t1 {font: 13px Verdana, Arial; line-height:18px; color:#007f40; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
/***************************/
/* PROGRAMA: acceso.php
*/
/***************************/
/***********************************/
/* Conectamos con la base de datos */
/***********************************/
$base = $db_monitores;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
/* Creamos la sentencia sql segn lo que queramos hacer */
if (!(isset($elecion))) print ("<table align=\"center\"><tr><td><p class=t1>Por
favor, elija qué quiere hacer</p></td></tr></table>");
else if ($elecion=="1"){
echo "<form action=insertar_monitor.php method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Rellene el formulario y pulse
Insertar.</p></td></tr>";
echo "<tr><td><p class=t2>Monitor:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"monitor\" SIZE=\"50\"
VALUE=\"\"></td></tr>";
echo "<tr><td><p class=t2>E-Mail:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"email\" SIZE=\"50\"
VALUE=\"\"><font class=t1> (opcional)</font></td></tr>";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Insertar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if ($elecion=="2"){
Pg. 248
Pg. 249
2.7.
/admin/acceso_notas.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
p.t3 {font: bold 14px Verdana, Arial; line-height:18px; color:#006655; TEXTDECORATION: none;text-indent:2px}
font.t1 {font: 13px Verdana, Arial; line-height:18px; color:#007f40; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
Pg. 250
/***************************/
/* PROGRAMA: acceso.php
*/
/***************************/
/***********************************/
/* Conectamos con la base de datos */
/***********************************/
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
/* Creamos la sentencia sql segn lo que queramos hacer */
if (!(isset($elecion))) print ("<table align=\"center\"><tr><td><p class=t1>Por
favor, elija qué quiere hacer</p></td></tr></table>");
else if ($elecion=="1"){
echo "<form action=insertar_nota.php method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Rellene el formulario y pulse
Insertar.</p></td></tr>";
echo "<tr><td><p class=t2>Alumno:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"alumno\" SIZE=\"50\"
VALUE=\"\"></td></tr>";
echo "<tr><td><p class=t2>Nota:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"nota\" SIZE=\"50\"
VALUE=\"\"></td></tr>";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Insertar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if ($elecion=="2"){
echo "<form action=borrar_nota.php method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2 align=\"center\"
bgcolor=\"#99CCAF\">\n";
echo "<tr><td colspan=3 align=\"center\"><p class=t1>Seleccione la nota a eliminar
y pulse Borrar</p></td></tr>\n";
echo "<tr><td width=5%><p class=t2> </p></td><td><p
class=t2>Alumno</p></td><td width=15%><p class=t2>Nota</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr>";
$cons = "SELECT id, alumno, nota FROM notas ";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
for ($i=0; $i<$k; $i++){
$valor = mysql_result($res, $i,0);
$name = "caja".$i;
echo "<tr><td> <input type=checkbox name=\"$name\"
value=\"$valor\"></td>\n";
$valor = mysql_result($res, $i,1);
print ("<td><p class=t3>$valor</p></td>\n");
$valor = mysql_result($res, $i,2);
print ("<td><p class=t3>$valor</p></td></tr>\n");
}
echo "<input type=\"hidden\" name=\"numnotas\" value=\"$k\">";
echo "<tr><td colspan=3> </td></tr>";
echo "<tr><td colspan=3 align=\"center\"><input type=submit
value=\"Borrar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
mysql_free_result($res);
Pg. 251
}
else if ($elecion=="3"){
echo "<form action=borrar_todas_notas.php method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2 align=\"center\"
bgcolor=\"#99CCAF\">\n";
echo "<tr><td colspan=3 align=\"center\"><p class=t1>Si sigue adelante borrar
todas las notas de la base de datos. Est seguro?</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr>";
$cons = "SELECT id FROM notas ";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
echo "<input type=\"hidden\" name=\"numnotas\" value=\"$k\">";
echo "<tr><td colspan=3 align=\"center\"><input type=submit
value=\"Seguir\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
mysql_free_result($res);
}
else if ($elecion=="4"){
echo "<form action=editar_nota.php method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2 align=\"center\"
bgcolor=\"#99CCAF\">\n";
echo "<tr><td colspan=3 align=\"center\"><p class=t1>Seleccione la nota a editar y
pulse Editar</p></td></tr>\n";
echo "<tr><td width=5%><p class=t2> </p></td><td><p
class=t2>Alumno</p></td><td width=15%><p class=t2>Nota</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr>";
$cons = "SELECT id, alumno, nota FROM notas ";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
for ($i=0; $i<$k; $i++){
$valor = mysql_result($res, $i,0);
if ($i == 0) {
echo "<tr><td> <input type=radio name=\"id_nota\" value=\"$valor\"
checked></td>\n";
} else {
echo "<tr><td> <input type=radio name=\"id_nota\"
value=\"$valor\"></td>\n";
}
$valor = mysql_result($res, $i,1);
print ("<td><p class=t3>$valor</p></td>\n");
$valor = mysql_result($res, $i,2);
print ("<td><p class=t3>$valor</p></td>\n");
}
echo "<tr><td colspan=3> </td></tr>";
echo "<tr><td colspan=3 align=\"center\"><input type=submit
value=\"Editar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
mysql_free_result($res);
}
else if ($elecion=="5"){
$cons = "SELECT asig, conv, fecha FROM datos";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
echo "<form action=editar_datos_notas.php method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
Pg. 252
2.8.
/admin/acceso_noticias.php
<?php
require('../config/config.php');
check_privs('noticias_w');
?>
<html>
<head>
<title>Acceso a la base de datos: noticias</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
Pg. 253
p.t3 {font: bold 14px Verdana, Arial; line-height:18px; color:#006655; TEXTDECORATION: none;text-indent:2px}
font.t1 {font: 13px Verdana, Arial; line-height:18px; color:#007f40; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
/***************************/
/* PROGRAMA: acceso.php
*/
/***************************/
/***********************************/
/* Conectamos con la base de datos */
/***********************************/
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
/* Creamos la sentencia sql segn lo que queramos hacer */
if (!(isset($elecion))) print ("<table align=\"center\"><tr><td><p class=t1>Por
favor, elija qué quiere hacer</p></td></tr></table>");
else if ($elecion=="1"){
echo "<form action=insertar_noticia.php method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Rellene el formulario y pulse
Insertar.</p></td></tr>";
echo "<tr><td><p class=t2>Noticia:</p></td>";
echo "<td><textarea name=\"noticia\" rows=\"5\" cols=\"50\"></textarea></td></tr>";
echo "<tr><td><p class=t2>Comentario:</p></td>";
echo "<td><textarea name=\"comentario\" rows=\"5\"
cols=\"50\"></textarea></td></tr>";
echo "<tr><td><p class=t2>Fecha:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"fecha\" SIZE=\"50\" VALUE=\"\">
<font class=t1> (opcional)</font></td></tr>";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Insertar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if ($elecion=="2"){
echo "<form action=borrar_noticia.php method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2 align=\"center\"
bgcolor=\"#99CCAF\">\n";
Pg. 254
Pg. 255
2.9.
/admin/admin_cuestionario.php
<?php
require('../config/config.php');
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">Acceso a la base de datos: cuestionario</h2>
<form action="acceso_cuestionario.php" method=post >
<table width="90%" align="center" cellpadding=1 cellspacing=2 bgcolor="#99CCAF">
<tr><td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
Pg. 256
<tr>
<td colspan=2 height="32">
<p class=t1>
Por favor, seleccione una opción:</p>
</td>
</tr>
<tr>
<td colspan=2 height="23"> </td>
</tr>
<tr>
<td valign="top" height="23" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="1" checked>
Insertar nueva cuestión.</p>
</td>
</tr>
<tr>
<td height="23" valign="top" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="2">
Borrar una cuestión.</p>
</td>
</tr>
<tr>
<td height="23" width="313" valign="top"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="3">
Borrar todas las cuestiones.</p>
</td>
</tr>
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="4">
Editar una cuestión.</p>
</td>
</tr>
<tr>
<td colspan=2 height="37"> </td>
</tr>
<tr>
<td colspan=2 height="37">
<p align="center">
<input type=submit value=Seguir>
</p>
</td>
</tr>
</table>
</td></tr>
</table>
</form>
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 257
2.10. /admin/admin_dudas.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">Acceso a la base de datos: dudas</h2>
<form action="acceso_dudas.php" method=post >
<table width="90%" align="center" cellpadding=1 cellspacing=2 bgcolor="#99CCAF">
<tr><td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td colspan=2 height="32">
<p class=t1>
Por favor, seleccione una opción:</p>
</td>
</tr>
<tr>
<td colspan=2 height="23"> </td>
</tr>
<tr>
<td valign="top" height="23" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="1" checked>
Insertar nueva duda.</p>
</td>
</tr>
<tr>
<td height="23" valign="top" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="2">
Borrar una duda.</p>
</td>
Pg. 258
</tr>
<tr>
<td height="23" width="313" valign="top"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="3">
Borrar todas las dudas.</p>
</td>
</tr>
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="4">
Editar una duda.</p>
</td>
</tr>
<tr>
<td colspan=2 height="37"> </td>
</tr>
<tr>
<td colspan=2 height="37">
<p align="center">
<input type=submit value=Seguir>
</p>
</td>
</tr>
</table>
</td></tr>
</table>
</form>
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.11. /admin/admin_encuesta.php
<?php
require('../config/config.php');
check_privs('encuesta_w');
?>
<html>
<head>
<title>Acceso a la base de datos: encuesta</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
Pg. 259
Pg. 260
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.12. /admin/admin_monitores.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
<head>
<title>Acceso a la base de datos: monitores</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">Acceso a la base de datos: monitores</h2>
<form action="acceso_monitores.php" method=post >
<table width="90%" align="center" cellpadding=1 cellspacing=2 bgcolor="#99CCAF">
<tr><td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td colspan=2 height="32">
<p class=t1>
Por favor, seleccione una opción:</p>
</td>
</tr>
<tr>
<td colspan=2 height="23"> </td>
</tr>
<tr>
<td valign="top" height="23" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="1" checked>
Insertar nuevo monitor.</p>
Pg. 261
</td>
</tr>
<tr>
<td height="23" valign="top" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="2">
Borrar un monitor.</p>
</td>
</tr>
<tr>
<td height="23" width="313" valign="top"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="3">
Borrar todos los monitores.</p>
</td>
</tr>
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="4">
Editar un monitor.</p>
</td>
</tr>
<tr>
<td colspan=2 height="37"> </td>
</tr>
<tr>
<td colspan=2 height="37">
<p align="center">
<input type=submit value=Seguir>
</p>
</td>
</tr>
</table>
</td></tr>
</table>
</form>
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.13. /admin/admin_notas.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
Pg. 262
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">Acceso a la base de datos: notas</h2>
<form action="acceso_notas.php" method=post >
<table width="90%" align="center" cellpadding=1 cellspacing=2 bgcolor="#99CCAF">
<tr><td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td colspan=2 height="32">
<p class=t1>
Por favor, seleccione una opción:</p>
</td>
</tr>
<tr>
<td colspan=2 height="23"> </td>
</tr>
<tr>
<td valign="top" height="23" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="1" checked>
Insertar nueva nota.</p>
</td>
</tr>
<tr>
<td height="23" valign="top" width="313"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="2">
Borrar una nota.</p>
</td>
</tr>
<tr>
<td height="23" width="313" valign="top"> </td>
<td width="547">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="3">
Borrar todas las notas.</p>
</td>
</tr>
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="4">
Editar una nota.</p>
</td>
</tr>
Pg. 263
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="5">
Editar datos de convocatoria, etc.</p>
</td>
<tr>
<td height="23"> </td>
<td height="23">
<p class=t2>
<input TYPE="radio" align="right" NAME="elecion" VALUE="6">
Importar notas desde fichero.</p>
</td>
</tr>
<tr>
<td colspan=2 height="37"> </td>
</tr>
<tr>
<td colspan=2 height="37">
<p align="center">
<input type=submit value=Seguir>
</p>
</td>
</tr>
</table>
</td></tr>
</table>
</form>
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.14. /admin/admin_noticias.php
<?php
require('../config/config.php');
check_privs('noticias_w');
?>
<html>
<head>
<title>Acceso a la base de datos: noticias</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
Pg. 264
Pg. 265
</td></tr>
</table>
</form>
<?php
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.15. /admin/borrar_cuestion.php
<?php
require('../config/config.php');
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_cuestionario;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$msg = "";
for($i=0;$i<$numcuestiones;$i++){
$name="caja".$i;
if (isset(${$name})){
$sql = "DELETE FROM pregunta WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n==0){
$msg .= "No se ha borrado correctamente la cuestión: ${$name}.<br>";
} else{
$sql = "DELETE FROM opciones WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
Pg. 266
if ($n==0){
$msg .= "No se ha borrado correctamente la cuestión: ${$name}. La base
de datos es inconsistente.<br>";
} else {
$msg .= "Correctamente borrada la cuestión: ${$name}.<br>";
}
}
}
}
mysql_close($id);
echo "<p align=center class=t1>".$msg."</p>";
pie("acceso_cuestionario.php?elecion=2", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.16. /admin/borrar_duda.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_dudas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$msg = "";
for($i=0;$i<$numdudas;$i++){
$name="caja".$i;
if (isset(${$name})){
$sql = "DELETE FROM dudas WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n==0){
$msg .= "No se ha borrado correctamente la duda: ${$name}.<br>";
Pg. 267
}
else{
$msg .= "Correctamente borrada la duda: ${$name}.<br>";
}
}
mysql_close($id);
echo "<p align=center class=t1>".$msg."</p>";
pie("acceso_dudas.php?elecion=2", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.17. /admin/borrar_encuesta_prof.php
<?php
require('../config/config.php');
check_privs('encuesta_w');
?>
<html>
<head>
<title>Acceso a la base de datos: encuesta.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (!(isset($prof))){
$msg = "Por favor, seleccione profesor.";
} else {
filtro_numerico($prof);
if ($prof < 1 || $prof > 3) {
$msg = "Profesor incorrecto.";
} else {
//Hemos pasado todos los chequeos. Realizamos el borrado.
$base = $db_encuesta;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$tablas_encuesta = array ('bloque1_prof', 'bloque2_prof', 'bloque3_prof',
'opinion_prof');
Pg. 268
2.18. /admin/borrar_monitor.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
<head>
<title>Acceso a la base de datos: monitores.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_monitores;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$msg = "";
for($i=0;$i<$nummonitores;$i++){
$name="caja".$i;
if (isset(${$name})){
$sql = "DELETE FROM monitores WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n==0){
Pg. 269
mysql_close($id);
echo "<p align=center class=t1>".$msg."</p>";
pie("acceso_monitores.php?elecion=2", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.19. /admin/borrar_nota.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$msg = "";
for($i=0;$i<$numnotas;$i++){
$name="caja".$i;
if (isset(${$name})){
$sql = "DELETE FROM notas WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n==0){
$msg .= "No se ha borrado correctamente la nota: ${$name}.<br>";
}
else{
Pg. 270
}
mysql_close($id);
echo "<p align=center class=t1>".$msg."</p>";
pie("acceso_notas.php?elecion=2", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.20. /admin/borrar_noticia.php
<?php
require('../config/config.php');
check_privs('noticias_w');
?>
<html>
<head>
<title>Acceso a la base de datos: noticias.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$msg = "";
for($i=0;$i<$numnoticias;$i++){
$name="caja".$i;
if (isset(${$name})){
$sql = "DELETE FROM noticias WHERE id=\"${$name}\"";
mysql_query($sql, $id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n==0){
$msg .= "No se ha borrado correctamente la noticia: ${$name}.<br>";
}
else{
$msg .= "Correctamente borrada la noticia: ${$name}.<br>";
}
}
Pg. 271
}
mysql_close($id);
echo "<p align=center class=t1>".$msg."</p>";
pie("acceso_noticias.php?elecion=2", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.21. /admin/borrar_todas.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_dudas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql="DELETE from dudas where id>=0";
mysql_query($sql,$id) or die ("Fallo en el acceso");
$n= mysql_affected_rows();
if ($n==$numdudas){
$msg = "Todas las dudas han sido correctamente borradas.";
} else {
$msg= "Error inesperado. Algunas dudas no han podido ser borradas.";
}
mysql_close($id);
print ("<p class=t1 align=center>$msg</p>");
pie("admin_dudas.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 272
2.22. /admin/borrar_todas_cuestiones.php
<?php
require('../config/config.php');
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_cuestionario;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql="DELETE from pregunta where id>=0";
mysql_query($sql,$id) or die ("Fallo en el acceso");
$n= mysql_affected_rows();
if ($n==$numcuestiones){
$sql = "DELETE FROM opciones WHERE id>=0";
mysql_query($sql,$id) or die ("Fallo en el acceso");
$n= mysql_affected_rows();
if ($n==$numcuestiones){
$msg = "Todas las cuestiones han sido correctamente borradas.";
} else {
$msg = "Error inesperado. Algunas cuestiones no han podido ser borradas. Base de
datos en estado inconsistente.";
}
} else {
$msg= "Error inesperado. Algunas cuestiones no han podido ser borradas. Tendr que
revisar la base de datos en busca de incongruencias.";
}
mysql_close($id);
print ("<p class=t1 align=center>$msg</p>");
pie("admin_cuestionario.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 273
2.23. /admin/borrar_todas_encuestas.php
<?php
require('../config/config.php');
check_privs('encuesta_w');
?>
<html>
<head>
<title>Acceso a la base de datos: encuesta.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_encuesta;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$tablas_encuesta = array ('bloque1_prof', 'bloque2_prof', 'bloque3_prof',
'opinion_prof');
for ($prof=1; $prof<=3; $prof++) {
foreach ($tablas_encuesta as $tabla) {
$sql="DELETE from $tabla$prof";
mysql_query($sql,$id) or die ("Fallo al intentar borrar");
}
}
$msg = "Todas las encuestas han sido correctamente eliminadas.";
mysql_close($id);
print ("<p class=t1 align=center>$msg</p>");
pie("admin_encuesta.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.24. /admin/borrar_todas_notas.php
<?php
Pg. 274
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql="DELETE from notas where id>=0";
mysql_query($sql,$id) or die ("Fallo en el acceso");
$n= mysql_affected_rows();
if ($n==$numnotas){
$msg = "Todas las notas han sido correctamente borradas.";
} else {
$msg= "Error inesperado. Algunas notas no han podido ser borradas.";
}
mysql_close($id);
print ("<p class=t1 align=center>$msg</p>");
pie("admin_notas.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.25. /admin/borrar_todas_noticias.php
<?php
require('../config/config.php');
check_privs('noticias_w');
?>
<html>
<head>
<title>Acceso a la base de datos: noticias.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
Pg. 275
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql="DELETE from noticias where id>=0";
mysql_query($sql,$id) or die ("Fallo en el acceso");
$n= mysql_affected_rows();
if ($n==$numnoticias){
$msg = "Todas las noticias han sido correctamente borradas.";
} else {
$msg= "Error inesperado. Algunas noticias no han podido ser borradas.";
}
mysql_close($id);
print ("<p class=t1 align=center>$msg</p>");
pie("admin_noticias.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.26. /admin/borrar_todos_monitores.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
<head>
<title>Acceso a la base de datos: monitores.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
Pg. 276
2.27. /admin/chpass.php
<?php
require('../config/config.php');
check_privs('chpass');
?>
<html>
<head>
<title>Cambio de contraseña.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 13px/15px Verdana, Arial; color:#000000; TEXT-DECORATION: none;textindent:2px}
p.t3 {font: 11px times new roman, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
LI {font: bold 13px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
A:active {COLOR: #004433; TEXT-DECORATION: none}
A:visited {COLOR: #004433; TEXT-DECORATION: none}
A:hover {BACKGROUND-COLOR: #ffffdd; COLOR: black; TEXT-DECORATION: none}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000" link="#004433" vlink="#004433"
alink="#004433">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
Pg. 277
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">Cambio de contraseña</h2>
<br>
<?php
if (isset($enviar)) {
// Conectamos con la bbdd de usuarios
conectar_admin();
mysql_select_db($db_usuarios);
// Comprobamos la contrasea actual
$hash_password = md5($pwd_actual);
$result = mysql_query("select * from cuentas where user = '".$_SESSION['user']."'
and pass = '$hash_password'");
// Si la contrasea actual es la correcta...
if (mysql_numrows($result) == 1) {
if ($pwd_nuevo1 == $pwd_nuevo2) {
$result = mysql_query("update cuentas set pass = '".md5($pwd_nuevo1)."' where
user = '".$_SESSION['user']."'");
if ($result) {
$msg = "La contraseña ha sido cambiada correctamente.";
} else {
$msg = "Error inesperado al acceder a la base de datos. Si el error persiste,
contacte con el Administrador.";
}
} else {
$msg = "No coincide la contrasea nueva con la repetida. Cambio no realizado.";
}
}
else {
$msg = "La contrasea actual que ha proporcionado es incorrecta. Cambio no
realizado.";
}
/*****************************************************************/
/* Ahora imprimimos un recuadro con el resultado de la operacin */
/*****************************************************************/
?>
<table width="90%" align="center" cellpadding=1 cellspacing=2>
<tr>
<td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td> </td>
</tr>
<tr>
<td width="49%">
Pg. 278
<div align="center">
<p class="t1"><?php echo $msg; ?></p>
</div>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</td>
</tr>
</table>
<?php
} else {
?>
<form action=<?php echo $PHP_SELF ?> method="post">
<table width="90%" align="center" cellpadding=1 cellspacing=2>
<tr>
<td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td colspan=3>
<p class=t1> Elija una de las opciones disponibles:</p>
</td>
</tr>
<tr>
<td colspan=3> </td>
</tr>
<tr>
<td colspan=2>
<p align="right" class="t2">Contraseña actual:</p>
</td>
<td width="49%">
<input type="password" name="pwd_actual" maxlength="16" size="16">
</td>
</tr>
<tr>
<td colspan=2>
<p align="right" class="t2">Contraseña nueva:</p>
</td>
<td width="49%">
<input type="password" name="pwd_nuevo1" maxlength="16" size="16">
</td>
</tr>
<tr>
<td colspan=2>
<p align="right" class="t2">Repita la nueva contraseña:</p>
</td>
<td width="49%">
<input type="password" name="pwd_nuevo2" maxlength="16" size="16">
</td>
</tr>
<tr>
<td colspan=3> </td>
</tr>
<tr>
<td colspan=3>
<div align="center">
<input type="submit" name="enviar" value="Realizar cambio">
</div>
</td>
</tr>
<tr>
Pg. 279
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<?php
}
?>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a
href="http://www.gte.us.es/fbarrero/csed/admin/"><img border=0
src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
2.28. /admin/crear_estadisticas.php
<?php
require('../config/config.php');
check_privs('encuesta_w');
?>
<html>
<head>
<title>Estadsticas sobre las encuestas de evaluacin de profesores.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
h2.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
Pg. 280
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000"
size="4"><small>Complementos de Sistemas Electrnicos Digitales</small></font>
</b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (!(isset($prof))){
die ("Por favor, seleccione profesor");
}
filtro_numerico($prof);
if ($prof < 1 || $prof > 3) {
die ("Profesor incorrecto");
}
echo "<h2 class=t1 align=\"center\">Estadísticas del profesor
<i>".${"profesor".$prof}."</i></h2>\n";
echo "<table align=\"center\" width=90% cellpading=1 cellspacing=1>";
echo "<tr><td bgcolor=\"$colorbg\">";
echo "<table align=\"center\" width=100% cellpading=1 cellspacing=1>";
$base = $db_encuesta;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql ="SELECT
id,valor1,pregunta1,pregunta2,pregunta3,pregunta4,pregunta5,pregunta6,pregunta7,pregu
nta8 FROM bloque1_prof".$prof;
$res=mysql_query($sql,$id) or die ("Fallo en la toma de datos");
$n=mysql_num_rows($res);
if ($n>0) {
print ("<tr bgcolor=\"$colorbg\"><td colspan=3><p class=t2>La encuesta ha sido
respondida por $n alumnos.</td></tr>\n");
print ("<tr><td> </td></tr>\n");
echo "<tr bgcolor=\"$colorbg\"><td colspan=2><p class=t2>Bloque</td><td><p
class=t2>Media aritmtica</td></tr>\n";
for ($j=1;$j<10;$j++)
{
$cuenta=0;
for ($i=0;$i<$n;$i++)
{
$ci=mysql_result($res,$i,$j);
$cuenta=$ci+$cuenta;
$med_abs=$cuenta/$n;
}
if ($j==1)
{
print ("<tr bgcolor=\"$colorbg\">\n<td colspan=2><p class=t2>ACTITUDES
PERSONALES</td>
\n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
else
{
$v=$j-1;
print ("<tr bgcolor=\"$colorbg\">\n<td width=5%> </td>\n<td><p
Pg. 281
class=t2>Pregunta
$v</td> \n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
}
mysql_free_result($res);
$sql ="SELECT
id,valor2,pregunta9,pregunta10,pregunta11,pregunta12,pregunta13,pregunta14,pregunta15
,pregunta16 FROM bloque2_prof".$prof;
$res=mysql_query($sql,$id) or die ("Fallo en la toma de datos");
$n=mysql_num_rows($res);
for ($j=1;$j<10;$j++)
{
$cuenta=0;
for ($i=0;$i<$n;$i++)
{
$ci=mysql_result($res,$i,$j);
$cuenta=$ci+$cuenta;
$med_abs=$cuenta/$n;
}
if ($j==1)
{
print ("<tr bgcolor=\"$colorbg\">\n<td colspan=2><p class=t2>COMPETENCIA
EXPOSITIVA</td>
\n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
else
{
$v=$j+7;
print ("<tr bgcolor=\"$colorbg\">\n<td width=5%> </td>\n<td><p
class=t2>Pregunta
$v</td> \n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
}
mysql_free_result($res);
$sql ="SELECT
id,valor3,pregunta17,pregunta18,pregunta19,pregunta20,pregunta21,pregunta22,pregunta2
3,pregunta24 FROM bloque3_prof".$prof;
$res=mysql_query($sql,$id) or die ("Fallo en la toma de datos");
$n=mysql_num_rows($res);
for ($j=1;$j<10;$j++)
{
$cuenta=0;
for ($i=0;$i<$n;$i++)
{
$ci=mysql_result($res,$i,$j);
$cuenta=$ci+$cuenta;
$med_abs=$cuenta/$n;
}
if ($j==1)
{
print ("<tr bgcolor=\"$colorbg\">\n<td colspan=2><p class=t2>ASPECTOS OBJETIVOS
DE PREPARACIN</td>
\n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
else
{
$v=$j+15;
print ("<tr bgcolor=\"$colorbg\">\n<td width=5%> </td>\n<td><p
class=t2>Pregunta
$v</td> \n<td><p class=t2>$med_abs</td>\n</tr>\n");
}
}
mysql_free_result($res);
?>
<table align="center" width=100% cellpading=1 cellspacing=1>
<tr><td bgcolor=<?php echo $colorbg; ?>>
<table align="center" width=100% cellpading=1 cellspacing=1>
<tr bgcolor=\"#88ddaa\"><td align="center"><p class=t2>OPINIONES</p></td></tr>
<?
$sql="SELECT opinion from opinion_prof".$prof;
$res=mysql_query($sql,$id);
$numop=mysql_num_rows($res);
for ($i=0;$i<$numop;$i++){
$op=mysql_result($res,$i,0);
Pg. 282
2.29. /admin/editar_cuestion.php
<?php
require('../config/config.php');
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (!(isset($cuestion)) && isset($id_cuestion)) {
$base = $db_cuestionario;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$cons = "SELECT texto, solucion FROM pregunta WHERE id=\"$id_cuestion\"";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$cuestion = mysql_result($res, 0, 0);
$solucion = mysql_result($res, 0, 1);
Pg. 283
Pg. 284
2.30. /admin/editar_datos_notas.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
Pg. 285
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($curso) && isset($convocatoria) && isset($fecha) && $curso!="" &&
$convocatoria!="" && $fecha!=""){
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "UPDATE datos SET asig=\"$curso\", conv=\"$convocatoria\",
fecha=\"$fecha\"";
$result = mysql_query($sql,$id);
if ($result){
$msg = "Los datos han sido guardados correctamente.";
}
else{
$msg = "Error inesperado. Contacte con el Administrador.";
}
mysql_close($id);
}
else {
$msg = "Debe rellenar todos los campos.";
}
if (isset($msg)) {
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
}
pie("acceso_notas.php?elecion=5", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.31. /admin/editar_duda.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
Pg. 286
Pg. 287
2.32. /admin/editar_monitor.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
<head>
<title>Acceso a la base de datos: monitores.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (!(isset($monitor)) && isset($id_monitor)) {
$base = $db_monitores;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$cons = "SELECT nombre, dir FROM monitores where id=\"$id_monitor\"";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
echo "<form action=$PHP_SELF method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Haga las modificaciones que estime oportunas y
pulse Aceptar</p></td></tr>";
echo "<tr><td><p class=t2>Monitor:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"monitor\" SIZE=\"50\"
VALUE=\"".mysql_result($res, 0,0)."\"></td></tr>";
echo "<tr><td><p class=t2>E-Mail:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"email\" SIZE=\"50\"
VALUE=\"".mysql_result($res, 0,1)."\"></td></tr>";
echo "<input TYPE=\"hidden\" NAME=\"id_monitor\" VALUE=\"$id_monitor\">";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Aceptar\"></td></tr>";
Pg. 288
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if (isset($monitor) && isset($email) && isset($id_monitor) && $monitor!="" &&
$id_monitor!=""){
$base = $db_monitores;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "UPDATE monitores SET nombre=\"$monitor\", dir=\"$email\" where
id=\"$id_monitor\" ";
$result = mysql_query($sql,$id);
if ($result){
$msg = "El monitor ha sido guardado correctamente.";
}
else{
$msg = "Error inesperado. Contacte con el Administrador.";
}
mysql_close($id);
}
else {
$msg = "El nombre del monitor es obligatorio. Debe rellenar este campo.";
}
if (isset($msg)) {
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
}
pie("acceso_monitores.php?elecion=4", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.33. /admin/editar_nota.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
Pg. 289
</table>
<hr>
<?
if (!(isset($alumno)) && isset($id_nota)) {
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$cons = "SELECT alumno, nota FROM notas where id=\"$id_nota\"";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
echo "<form action=$PHP_SELF method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Haga las modificaciones que estime oportunas y
pulse Aceptar</p></td></tr>";
echo "<tr><td><p class=t2>Alumno:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"alumno\" SIZE=\"50\"
VALUE=\"".mysql_result($res, 0,0)."\"></td></tr>";
echo "<tr><td><p class=t2>Nota:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"nota\" SIZE=\"50\"
VALUE=\"".mysql_result($res, 0,1)."\"></td></tr>";
echo "<input TYPE=\"hidden\" NAME=\"id_nota\" VALUE=\"$id_nota\">";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Aceptar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if (isset($alumno) && isset($nota) && isset($id_nota) && $alumno!="" &&
$nota!="" && $id_nota!=""){
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "UPDATE notas SET alumno=\"$alumno\", nota=\"$nota\" where id=\"$id_nota\"
";
$result = mysql_query($sql,$id);
if ($result){
$msg = "La nota ha sido guardada correctamente.";
}
else{
$msg = "Error inesperado. Contacte con el Administrador.";
}
mysql_close($id);
}
else {
$msg = "Debe rellenar todos los campos.";
}
if (isset($msg)) {
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
}
pie("acceso_notas.php?elecion=4", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.34. /admin/editar_noticia.php
<?php
require('../config/config.php');
check_privs('noticias_w');
Pg. 290
?>
<html>
<head>
<title>Acceso a la base de datos: noticias.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (!(isset($noticia)) && isset($id_noticia)) {
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$cons = "SELECT noticia, comentario, fecha FROM noticias where id=\"$id_noticia\"";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
echo "<form action=$PHP_SELF method=post>";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Haga las modificaciones que estime oportunas y
pulse Aceptar</p></td></tr>";
echo "<tr><td><p class=t2>Noticia:</p></td>";
echo "<td><textarea name=\"noticia\" rows=\"5\" cols=\"50\">".mysql_result($res,
0,0)."</textarea></td></tr>";
echo "<tr><td><p class=t2>Comentario:</p></td>";
echo "<td><textarea name=\"comentario\" rows=\"5\" cols=\"50\">".mysql_result($res,
0,1)."</textarea></td></tr>";
echo "<tr><td><p class=t2>Fecha:</p></td>";
echo "<td><input TYPE=\"text\" align=left NAME=\"fecha\" SIZE=\"50\"
VALUE=\"".mysql_result($res, 0,2)."\"></td></tr>";
echo "<input TYPE=\"hidden\" NAME=\"id_noticia\" VALUE=\"$id_noticia\">";
echo "<tr><td colspan=2 align=\"center\"><input type=submit
value=\"Aceptar\"></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
else if (isset($noticia) && isset($comentario) && isset($fecha) && isset($id_noticia)
&& $noticia!="" && $comentario!="" && $fecha!="" && $id_noticia!=""){
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
Pg. 291
2.35. /admin/importar_notas.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($_FILES['fichero'])) {
if (is_uploaded_file($_FILES['fichero']['tmp_name']) && $_FILES['fichero']['size']
!= 0) {
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base.");
Pg. 292
// Fix para que funcione bien el INFILE en Windows (cambia las '\' a '/')
$_FILES['fichero']['tmp_name'] = preg_replace("/\\\\/", "/",
$_FILES['fichero']['tmp_name']);
$sql = "LOAD DATA LOCAL INFILE \"".$_FILES['fichero']['tmp_name']."\" INTO TABLE
notas (alumno,nota)";
$result = mysql_query($sql,$id);
if ($result){
$msg = "Fichero importado correctamente.";
}
else{
$msg = "Error al importar fichero: ".$_FILES['fichero']['name'];
}
mysql_close($id);
} else {
$msg = "No se ha podido subir el fichero
<i>\"".$_FILES['fichero']['name']."\"</i>. Compruebe que el path y el nombre del
fichero estn correctamente escritos.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
}
else {
echo "<form enctype=\"multipart/form-data\" action=$PHP_SELF method=\"post\">";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Seleccione el fichero a importar y pulse
Aceptar</p></td></tr>";
echo "<tr><td><p class=t2>Fichero:</p></td>";
echo "<td><input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"2000000\"><input
name=\"fichero\" type=\"file\"></td></tr>";
echo "<tr><td> </td></tr>";
echo "<tr><td colspan=2 align=\"center\"><input type=submit value=\"Subir
fichero\"></form></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
pie("admin_notas.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.36. /admin/importar_usuarios.php
<?php
require('../config/config.php');
check_privs('usuarios_add');
?>
<html>
<head>
<title>Acceso a la base de datos: usuarios.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
Pg. 293
Pg. 294
else {
echo "<form enctype=\"multipart/form-data\" action=$PHP_SELF method=\"post\">";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=2>";
echo "<tr><td bgcolor=#007f40>";
echo "<table width=100% border=0 cellpadding=2 cellspacing=4 align=\"center\"
bgcolor=\"#99CCAF\">";
echo "<tr><td colspan=2><p class=t1>Seleccione el fichero a importar y pulse
Aceptar</p></td></tr>";
echo "<tr><td><p class=t2>Fichero:</p></td>";
echo "<td><input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"2000000\"><input
name=\"fichero\" type=\"file\"></td></tr>";
echo "<tr><td> </td></tr>";
echo "<tr><td colspan=2 align=\"center\"><input type=submit value=\"Subir
fichero\"></form></td></tr>";
echo "</table>";
echo "</td></tr>";
echo "</table>";
}
pie("usuarios.php", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.37. /admin/index.php
<?php
require('../config/config.php');
check_privs('admin_tool');
?>
<html>
<head>
<title>Herramientas administrativas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 13px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t3 {font: 11px times new roman, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
LI {font: bold 13px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
A:active {COLOR: #004433; TEXT-DECORATION: none}
Pg. 295
Pg. 296
<?php
if ($_SESSION['realname']) {
$id = $_SESSION['realname']." (usuario <i>\"".$_SESSION['user']."\"</i>)";
} else {
$id = "<i>\"".$_SESSION['user']."\"</i>";
}
echo "Identificado como: $id. ";
?>
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img
border=0 src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
2.38. /admin/insertar_cuestion.php
<?php
require('../config/config.php');
Pg. 297
check_privs('cuestionario_w');
?>
<html>
<head>
<title>Acceso a la base de datos: cuestionario.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($cuestion) && isset($opa) && isset($opb) && isset($solucion) &&
$cuestion!="" && $opa!="" && $opb!="" && $solucion!=""){
$base = $db_cuestionario;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "INSERT INTO pregunta(id,texto,solucion)
VALUES(\"\",\"$cuestion\",\"$solucion\")";
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "Fallo al introducir cuestin. Contacte con el Administrador.";
} else{
$sql = "INSERT INTO opciones(id,opciona,opcionb,opcionc,opciond)
VALUES(\"\",\"$opa\",\"$opb\",\"$opc\",\"$opd\")";
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "Fallo al introducir las opciones de la cuestin. La base de datos
quedar en estado inconsistente. Contacte con el Administrador urgentemente.";
} else {
$msg = "Correctamente introducido.";
}
}
mysql_close($id);
}
else {
$msg = "Los campos de cuestin, opcin a, opcin b y solucin son obligatorios.
Debe rellenarlos.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
pie("acceso_cuestionario.php?elecion=1", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 298
2.39. /admin/insertar_duda.php
<?php
require('../config/config.php');
check_privs('dudas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: dudas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($pregunta) && isset($respuesta) && isset($fecha) && $pregunta!="" &&
$respuesta!=""){
$base = $db_dudas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
if ($fecha) {
$sql = "INSERT INTO dudas(id,pregunta,respuesta,fecha) VALUES
(\"\",\"$pregunta\",\"$respuesta\",\"$fecha\")";
} else {
$sql = "INSERT INTO dudas(id,pregunta,respuesta,fecha) VALUES
(\"\",\"$pregunta\",\"$respuesta\", current_date)";
}
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "No se ha introducido correctamente.";
}
else{
$msg = "Correctamente introducido.";
}
mysql_close($id);
}
else {
$msg = "Los campos de pregunta y respuesta son obligatorios. Debe rellenarlos.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
pie("acceso_dudas.php?elecion=1", "http://www.gte.us.es/~fbarrero/CSED/");
?>
Pg. 299
</body>
</html>
2.40. /admin/insertar_monitor.php
<?php
require('../config/config.php');
check_privs('monitores_w');
?>
<html>
<head>
<title>Acceso a la base de datos: monitores.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($monitor) && isset($email) && $monitor!=""){
$base = $db_monitores;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "INSERT INTO monitores(id,nombre,dir) VALUES
(\"\",\"$monitor\",\"$email\")";
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "No se ha introducido correctamente.";
}
else{
$msg = "Correctamente introducido.";
}
mysql_close($id);
}
else {
$msg = "El nombre del monitor es obligatorio. Debe rellenar este campo.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
pie("acceso_monitores.php?elecion=1", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 300
2.41. /admin/insertar_nota.php
<?php
require('../config/config.php');
check_privs('notas_w');
?>
<html>
<head>
<title>Acceso a la base de datos: notas.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($alumno) && isset($nota) && $alumno!="" && $nota!=""){
$base = $db_notas;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
$sql = "INSERT INTO notas(id,alumno,nota) VALUES (\"\",\"$alumno\",\"$nota\")";
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "No se ha introducido correctamente.";
}
else{
$msg = "Correctamente introducido.";
}
mysql_close($id);
}
else {
$msg = "Debe rellenar todos los campos.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
pie("acceso_notas.php?elecion=1", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 301
2.42. /admin/insertar_noticia.php
<?php
require('../config/config.php');
check_privs('noticias_w');
?>
<html>
<head>
<title>Acceso a la base de datos: noticias.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?
if (isset($noticia) && isset($comentario) && isset($fecha) && $noticia!="" &&
$comentario!=""){
$base = $db_noticias;
$id = conectar_admin();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
if ($fecha) {
$sql = "INSERT INTO noticias(id,noticia,comentario,fecha) VALUES
(\"\",\"$noticia\",\"$comentario\",\"$fecha\")";
} else {
$sql = "INSERT INTO noticias(id,noticia,comentario,fecha) VALUES
(\"\",\"$noticia\",\"$comentario\", current_date)";
}
mysql_query($sql,$id) or die ("Fallo en la toma de datos.");
$n= mysql_affected_rows();
if ($n!=1){
$msg = "No se ha introducido correctamente.";
}
else{
$msg = "Correctamente introducido.";
}
mysql_close($id);
}
else {
$msg = "Los campos de noticia y comentario son obligatorios. Debe rellenarlos.";
}
echo "<table align=\"center\"><tr><td><p class=t1>".$msg."</p></td></tr></table>";
pie("acceso_noticias.php?elecion=1", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
Pg. 302
2.43. /admin/logout.php
<?php
require('../config/config.php');
session_start();
session_destroy();
?>
<html>
<head>
<title>Sesión cerrada.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 13px/15px Verdana, Arial; color:#000000; TEXT-DECORATION: none;textindent:2px}
p.t3 {font: 11px times new roman, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
LI {font: bold 13px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
A:active {COLOR: #004433; TEXT-DECORATION: none}
A:visited {COLOR: #004433; TEXT-DECORATION: none}
A:hover {BACKGROUND-COLOR: #ffffdd; COLOR: black; TEXT-DECORATION: none}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000" link="#004433" vlink="#004433"
alink="#004433">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<p>
<table width="90%" align="center" cellpadding=1 cellspacing=2>
<tr>
<td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td> </td>
</tr>
<tr>
<td width="49%">
<div align="center">
<p class="t1">** La sesin ha sido cerrada correctamente **</p>
</div>
</td>
</tr>
<tr>
<td> </td>
</tr>
Pg. 303
</table>
</td>
</tr>
</table>
<?php
pie("", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.44. /admin/usuarios.php
<?php
// ***************
// ** Funciones **
// ***************
// Genera una contrasea aleatoria de longitud $long
function genera_pass($long) {
$chars = array();
for($i=48; $i<=57; $i++) {
array_push($chars, chr($i));
}
for($i=65; $i<=90; $i++) {
array_push($chars, chr($i));
}
for($i=97; $i<=122; $i++) {
array_push($chars, chr($i));
}
$passwd="";
for($i=0; $i<$long; $i++) {
mt_srand((double)microtime()*1000000);
$passwd.=$chars[mt_rand(0,count($chars)-1)];
}
return $passwd;
}
Pg. 304
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
td.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
font.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#004433; TEXTDECORATION: none;text-indent:2px}
A:active {COLOR: #004433; TEXT-DECORATION: none}
A:visited {COLOR: #004433; TEXT-DECORATION: none}
A:link {COLOR: #004433; TEXT-DECORATION: none}
A:hover {BACKGROUND-COLOR: #ffffdd; COLOR: black; TEXT-DECORATION: none}
</style>
</head>
<body bgcolor="#EEEEEE" text="#000000">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo
de Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<?php
}
// Lee los nombres de los distintos campos de permisos y los devuelve ordenados
alfabticamente.
// Crea permisos nulos
function lee_permisos() {
global $defperm;
// Buscamos la entrada correspondiente al usuario "root" (se
// presupone q existe esta entrada)
$result = mysql_query("select * from permisos where user='root'");
if (!($row = mysql_fetch_assoc($result))) {
die("No existe el usuario root!!");
}
reset($row);
next($row);
permiso en s
Pg. 305
echo "
<center><h1>
<bold>
<u><i>$string</i></u>
</bold>
</h1></center>
<br>
<p>
";
return;
";
echo "
<table border = '3' align=\"center\" background=\"../images/fondo2.jpg\">
<tr>
if ($metodo == "listar") {
echo "
<td bgcolor=\"$color\">
<b><i><center>Editar</center></i></b>
</td>
<td bgcolor=\"$color\">
<b><i><center>Borrar</center></i></b>
</td>
";
}
echo "
<td bgcolor=\"$color\">
<b><center>Nombre</center></b>
</td>
Pg. 306
";
Pg. 307
return;
}
bgcolor ($color);
banner ($string);
Pg. 308
// Chequea formulario
function check_form ($usuario, $pass, $pass_verify, $nombre) {
if ($pass != $pass_verify)
$code = 1;
Pg. 309
return;
Pg. 310
<hr>
";
return;
// Verificacin de formulario.
function verify_form ($metodo, $color, $colorA, $usuario, $pass, $pass_verify,
$nombre, $modificado, $perm) {
$error = check_form ($usuario, $pass, $pass_verify, $nombre);
// En caso de error damos la opcin de corregir formulario
if ($error) {
switch ($error) {
case 1:
$msg = "Ha escrito mal la contraseña. Escríbala de nuevo
cuidadosamente.";
mensaje($msg);
ask_correct ($metodo, $usuario, "", "", $nombre, $perm, "no");
break;
case 2:
$msg = "El campo \"usuario\" no puede estar vacío.";
mensaje($msg);
ask_correct ($metodo, $usuario, $pass, $pass_verify, $nombre, $perm, "no");
break;
case 3:
$msg = "No se permiten contraseñas en blanco.";
mensaje($msg);
ask_correct ($metodo, $usuario, $pass, $pass_verify, $nombre, $perm, "no");
break;
default:
// Error genrico
break;
}
return;
Pg. 311
echo "</p>";
hidden_form ($metodo, "si", $usuario, $pass, $pass_verify, $nombre, $perm, "");
}
return;
// Actualizar base de datos (ya sea con nueva entrada o modificacin de una ya
existente)
function updatedb ($metodo, $usuario, $pass, $nombre, $perm) {
// Por razones de seguridad, escapamos caracteres especiales en la query
$usuario = addslashes ($usuario);
$pass = addslashes ($pass);
$nombre = addslashes ($nombre);
// Actualiza la db
if ($metodo == "anadir") {
$result = mysql_query("insert into cuentas values ('$usuario', md5('$pass'),
'$nombre', NULL)");
if (mysql_affected_rows() == 1) {
$campos = implode(",", array_keys($perm));
$valores = implode(",", array_values($perm));
$result = mysql_query("insert into permisos (user,$campos) values
('$usuario',$valores)");
if (mysql_affected_rows() == 1) {
$msg = "El usuario ha sido añadido correctamente.";
// Insercin
correcta :-)
} else {
$msg = "Fallo al añadir usuario. La base de datos de usuarios ha
quedado en estado inconsistente. Consulte con el Administrador.";
}
} else {
$msg = "No se ha podido añadir usuario. Probablemente ese usuario ya
exista.";
}
} else {
// "editar"
if ($pass == "NoCAmBiARmE") {
$cadpass = "";
} else {
$cadpass = "pass='$pass',";
}
$result = mysql_query("update cuentas set user='$usuario', $cadpass
realname='$nombre', modificado=NULL where user='$usuario'");
if ($result) {
$asignaciones="user='$usuario'";
foreach ($perm as $key => $value) {
$asignaciones .= ", $key=$value";
}
$result = mysql_query("update permisos set $asignaciones where
user='$usuario'");
if ($result) {
$msg = "Los cambios han sido guardados satisfactoriamente.";
} else {
$msg = "Fallo al actualizar datos de permisos. Consulte con el
Administrador.";
Pg. 312
}
} else {
$msg = "Fallo al actualizar datos. Consulte con el Administrador.";
}
mensaje($msg);
return;
}
// **********
// ** MAIN **
// **********
// Importamos las variables globales y funciones necesarias
require('../config/config.php');
// Conectamos con la base de datos de usuarios
conectar_admin();
mysql_select_db($db_usuarios);
// Colores de fondo de las distintas
define("COLOR1", "#DDDDDD");
define("COLOR1A", "#FFFFFF");
define("COLOR1B", "#EEEEEE");
define("COLOR1F", "#EEEEEE");
define("COLOR2", "#DDDDDD");
define("COLOR2A", "#FFFFFF");
define("COLOR2B", "#EEEEEE");
define("COLOR2F", "#EEEEEE");
//
//
//
//
define("COLOR3", "#DDDDDD");
define("COLOR3A", "#FFFFFF");
define("COLOR3B", "#EEEEEE");
define("COLOR3F", "#EEEEEE");
//
//
//
//
define("COLOR4", "#DDDDDD");
define("COLOR4A", "#FFFFFF");
define("COLOR4B", "#EEEEEE");
define("COLOR4F", "#EEEEEE");
//
//
//
//
Pg. 313
// "" or "no"
// Formulario
$perm = lee_permisos();
if ($sure=="") {
// Es la primera vez que mostramos el formulario: usamos permisos por
defecto
break;
case "editar":
/****************************/
/** EDITAR INFO DE USUARIO **/
/****************************/
Pg. 314
check_privs('usuarios_edit');
cabecera_html();
// Nos quitamos un "notice" por no estar seteada la variable
if (!(isset($sure))) {
$sure="";
}
switch ($sure) {
case "check":
$perm = lee_permisos();
foreach ($perm as $key => $value) {
if (isset(${$key})) {
$perm[$key] = ${$key};
}
if ($usuario=="root") {
$perm[$key] = 1;
}
}
verify_form ($metodo, COLOR2, COLOR2A, $usuario, $pass, $pass_verify,
$nombre, "", $perm);
pie("", "http://www.gte.us.es/~fbarrero/CSED/");
break;
case "si":
$perm = lee_permisos();
foreach ($perm as $key => $value) {
if (isset(${$key})) {
$perm[$key] = ${$key};
}
}
updatedb ($metodo, $usuario, $pass, $nombre, $perm);
pie("$PHP_SELF", "http://www.gte.us.es/~fbarrero/CSED/");
break;
default:
// "" or "no"
// Formulario
$usuario = addslashes ($usuario);
if ($sure == "") {
// Es la primera vez q editamos: leemos todos los datos del usuario de la
bbdd
reset($row);
for ($i=1 ; $i<=3; $i++) {
next($row);
}
// Creamos el array de permisos
while (list ($key, $val) = each ($row)) {
$perm[$key] = $val;
}
// Ordenamos alfabticamente los permisos
ksort($perm);
// Obtenemos las variables q hacen falta
Pg. 315
$pass = "NoCAmBiARmE";
$nombre = $row["realname"];
} else {
// Estamos reeditando formulario: cargamos permisos anteriores
$perm = lee_permisos();
foreach ($perm as $key => $value) {
if (isset(${$key})) {
$perm[$key] = ${$key};
}
}
}
// Mostramos el formulario de edicin
user_form_tittle ("Editar usuario", COLOR2F);
// Dibuja el titulo del
formulario
user_form ($metodo, $usuario, $pass, $pass, $nombre, $perm);
pie("$PHP_SELF", "http://www.gte.us.es/~fbarrero/CSED/");
break;
}
break;
case "borrar":
/********************/
/** BORRAR USUARIO **/
/********************/
check_privs('usuarios_del');
// Nos quitamos un "notice" por no estar seteada la variable
if (!(isset($sure))) {
$sure="";
}
switch ($sure) {
case "":
cabecera_html();
if ($usuario == "root") {
$msg = "La cuenta \"root\" siempre debe existir en el sistema. Por
tanto, no se permite su eliminación.";
mensaje($msg);
pie($PHP_SELF, "http://www.gte.us.es/~fbarrero/CSED/");
exit;
}
// Obtenemos datos de usuario
$usuario = addslashes ($usuario);
$result = mysql_query("select cuentas.user, cuentas.realname,
cuentas.modificado, permisos.* from cuentas, permisos where cuentas.user =
permisos.user and cuentas.user='$usuario'");
$row = mysql_fetch_assoc($result);
// Dibujamos tabla con los datos y pedimos confirmacin
bgcolor (COLOR3F);
banner ("Confirmación");
print_header ("borrar", COLOR3);
//
//
//
//
reset($row);
for ($i=1 ; $i<=3; $i++) {
Pg. 316
next($row);
}
// Creamos el array de permisos
while (list ($key, $val) = each ($row)) {
$perm[$key] = $val;
}
// Ordenamos alfabticamente los permisos
ksort($perm);
// Finalmente, imprimimos la fila de la tabla actual
print_row ("borrar", COLOR3A, $row["user"], $row["realname"],
$row["modificado"], $perm);
print_foot ();
echo "</p>";
hidden_form ("borrar", "si", $usuario, "", "", "", $perm, "");
pie($PHP_SELF, "http://www.gte.us.es/~fbarrero/CSED/");
break;
case "si":
cabecera_html();
$usuario = addslashes ($usuario);
$result = mysql_query("delete from cuentas where user='$usuario'");
if (mysql_affected_rows() == 1) {
$result = mysql_query("delete from permisos where user='$usuario'");
if (mysql_affected_rows () == 1) {
$msg = "El usuario ha sido correctamente eliminado.";
} else {
$msg = "Fallo al borrar usuario. La base de datos ha quedado en
estado inconsistente. Consulte con el Administrador.";
}
} else {
$msg = "Error al borrar usuario. Consulte con el
Administrador.";
}
mensaje($msg);
pie($PHP_SELF, "http://www.gte.us.es/~fbarrero/CSED/");
break;
case "no":
header ("Location: $PHP_SELF?metodo=listar");
exit;
break;
case "clear":
/********************************/
/** BORRAR _TODOS_ LOS USUARIO **/
/********************************/
check_privs('usuarios_del');
// Nos quitamos un "notice" por no estar seteada la variable
if (!(isset($sure))) {
$sure="";
}
switch ($sure) {
case "":
cabecera_html();
echo "<form action=$PHP_SELF?metodo=clear method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
Pg. 317
case "no":
header ("Location: $PHP_SELF?metodo=listar");
exit;
break;
case "info":
/************************************************/
/** INFO SOBRE LOS PERMISOS / FLAGS DE USUARIO **/
/************************************************/
check_privs('usuarios_list');
cabecera_html();
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2 align=\"center\"
bgcolor=\"#ddeecc\">\n";
echo "<tr><td colspan=3> </td></tr>";
echo "<tr><td colspan=3 align=\"left\"><p class=t1
align=\"center\"><u>Explicacin de flags y permisos de usuario</u></p><p
class=t1><ul>";
echo "<li><b>admin_tool:</b> permite acceso al men general de administracin.";
echo "<li><b>chpass:</b> el usuario podr cambiar su contrasea.";
echo "<li><b>cuestionario_r:</b> permite acceso (slo lectura) al servicio
\"cuestionario\" (test de autoevaluacin).";
Pg. 318
$color = COLOR4A;
$result = mysql_query("select cuentas.user, cuentas.realname, cuentas.modificado,
permisos.* from cuentas, permisos where cuentas.user = permisos.user order by
cuentas.user");
while ($row = mysql_fetch_assoc($result)) {
//
//
//
//
reset($row);
for ($i=1 ; $i<=3; $i++) {
next($row);
}
// Creamos el array de permisos
while (list ($key, $val) = each ($row)) {
$perm[$key] = $val;
}
// Ordenamos alfabticamente los permisos
ksort($perm);
Pg. 319
echo "
<p>
<table width=\"100%\">
<tr>
<td width=\"5%\" class=t2 align=\"right\">
<img border=\"0\" src=\"../images/new.gif\" align=\"middle\">
</td>
<td width=\"22%\" class=t2>
<a href=\"$PHP_SELF?metodo=anadir\">Nuevo usuario</a>
</td>
<td width=\"22%\" class=t2>
<a href=\"$PHP_SELF?metodo=clear\">Borrar todos los usuarios</a>
</td>
<td width=\"22%\" class=t2>
<a href=\"$PHP_SELF?metodo=info\">Info sobre permisos de usuario</a>
</td>
<td width=\"22%\" class=t2>
<a href=\"$PHP_SELF?metodo=importar\">Importar usuarios desde fichero</a>
</td>
</tr>
</table>
";
pie(".", "http://www.gte.us.es/~fbarrero/CSED/");
break;
case "importar":
/**********************/
/** IMPORTAR FICHERO **/
/**********************/
check_privs('usuarios_add');
// Nos quitamos un "notice" por no estar seteada la variable
if (!(isset($estado))) {
$estado="";
}
switch ($estado) {
case "":
cabecera_html();
echo "<form action=$PHP_SELF?metodo=importar method=post>\n";
echo "<table width=\"90%\" align=\"center\" cellpadding=1 cellspacing=0>\n";
echo "<tr><td bgcolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2
align=\"center\" bgcolor=\"#ddeecc\">\n";
echo "<tr><td colspan=3 align=\"left\"><p class=t1> Esta
opción permite importar usuarios desde un fichero ASCII con formato
<i>\"campos separados por tabuladores\"</i>. Este formato es estándar y casi
cualquier base de datos (ej: <i>Microsoft Access</i>) e incluso otros programas (ej:
<i>Microsoft Excel</i>) permiten exportar al mismo.</p><p class=t1> Los
usuarios contenidos en el fichero serán <i>agregados</i> a la base de datos,
Pg. 320
Pg. 321
lugar seguro, ya que sta ser la nica ocasin donde podr visualizar las
contraseas generadas</u> (la base de datos almacenar las contraseas
<i>encriptadas</i> con un algoritmo irreversible).</p>\n";
echo "<p class=t1> Los permisos de usuario sern establecidos de
acuerdo a los permisos por defecto definidos en el archivo de configuracin del
portal.</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr>";
echo "<tr><td colspan=3 align=\"center\"><input type=\"hidden\"
name=\"estado\" value=\"2\"><input type=submit value=\"Seguir adelante\"></td></tr>";
echo "</table>";
echo "</table></form>";
pie("$PHP_SELF?metodo=importar&estado=\"\"",
"http://www.gte.us.es/~fbarrero/CSED/");
break;
case "2":
cabecera_html();
$msg="";
if (is_uploaded_file($_FILES['fichero']['tmp_name']) &&
$_FILES['fichero']['size'] != 0) {
// Fix para que funcione bien el INFILE en Windows (cambia las '\' a '/')
//
$_FILES['fichero']['tmp_name'] = preg_replace("/\\\\/", "/",
$_FILES['fichero']['tmp_name']);
// Leo todo el fichero en un array (cada elemento contendr una linea del
fichero)
Pg. 322
}
// Insertamos usuario en la bbdd
$result = mysql_query("insert into cuentas (user, pass, realname,
modificado) values ('$usuario', md5('$pass'), '$nombre', NULL)");
if (mysql_affected_rows() == 1) {
$campos = implode(",", array_keys($perm));
$valores = implode(",", array_values($perm));
$result = mysql_query("insert into permisos (user,$campos) values
('$usuario',$valores)");
if (mysql_affected_rows() == 1) {
// **Usuario correctamente importado
$sufijo++;
// Lo aadimos al array $generado
array_push($generado_nombre, $nombre);
array_push($generado_usuario, $usuario);
array_push($generado_pass, $pass);
} else {
// **Error al insertar permisos. BBDD en estado inconsistente
die("Error al insertar permisos. BBDD en estado inconsistente.
Consulte con el Administrador. Los usuarios anteriores a este error s es posible que
hayan sido introducidos. Eche un vistazo al listado de usuarios, por favor.");
}
} else {
// **No se aadi usuario. Debe haber algn problema con la bbdd o el
fichero a importar tiene alguna entrada con caracteres extraos. Ignoramos el error.
}
}
}
} else {
$msg = "No se ha podido subir el fichero
<i>\"".$_FILES['fichero']['name']."\"</i>. Compruebe que el path y el nombre del
fichero estn correctamente escritos.";
}
if ($msg) {
echo "<table align=\"center\"><tr><td><p
class=t1>".$msg."</p></td></tr></table>";
pie("$PHP_SELF?metodo=importar&estado=1",
"http://www.gte.us.es/~fbarrero/CSED/");
exit;
}
// Imprimimos hoja de resultados
if (($max=count($generado_nombre)) > 0) {
echo "<br><table width=\"90%\" border=1 align=\"center\" cellpadding=1
cellspacing=0>\n";
echo "<tr><td bgcolor=\"#ddeecc\" bordercolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2
align=\"center\" bgcolor=\"#ddeecc\">\n";
echo "<tr><td colspan=3 align=\"left\"><p class=t1> Se han
añadido correctamente los siguientes usuarios:</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr></table>";
echo "<table width=90% border=0 cellpadding=1 cellspacing=2
align=\"center\" bgcolor=\"#ddeecc\">
<tr>
<td><p align=\"left\" class=t1><u>Nombre</u></p></td>
<td><p align=\"left\" class=t1><u>Usuario</u></p></td>
<td><p align=\"left\" class=t1><u>Contraseña</u></p></td>
</tr>
";
for ($i=0; $i<$max; $i++) {
echo "<tr>
Pg. 323
";
}
echo "</table>\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2
align=\"center\" bgcolor=\"#ddeecc\">\n";
echo "<tr><td colspan=3 align=\"left\"><br><p class=t1> <u>No
olvide imprimir esta relacin y gurdela en un lugar seguro, ya que sta ser la
nica ocasin donde podr visualizar las contraseas generadas</u> (la base de datos
almacenar las contraseas <i>encriptadas</i> con un algoritmo no
reversible).</p>\n";
echo "<tr><td colspan=3> </td></tr>";
echo "</table>";
echo "</table>";
pie("$PHP_SELF", "http://www.gte.us.es/~fbarrero/CSED/");
} else {
echo "<br><table width=\"90%\" border=1 align=\"center\" cellpadding=1
cellspacing=0>\n";
echo "<tr><td bgcolor=\"#ddeecc\" bordercolor=\"#007f40\">\n";
echo "<table width=100% border=0 cellpadding=1 cellspacing=2
align=\"center\" bgcolor=\"#ddeecc\">\n";
echo "<tr><td colspan=3 align=\"left\"><p class=t1> No se ha
añadido ningn usuario. Puede que el fichero que ha importado no contuviera
ninguna entrada vlida. Tambin es posible que haya algn problema con el servidor de
bases de datos.</p></td></tr>\n";
echo "<tr><td colspan=3> </td></tr>";
echo "</table>";
echo "</table>";
pie("$PHP_SELF", "http://www.gte.us.es/~fbarrero/CSED/");
}
}
}
?>
break;
//End Switch ($metodo)
</body>
</html>
2.45. /autoevaluacion/autoevaluacion.php
<?php
require('../config/config.php');
check_privs('cuestionario_r');
?>
<html>
<head>
<title>Autoevaluacion.</title>
<style>
p.t1 {font: bold 13px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: 12px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
</style>
Pg. 324
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h2 align="center">TEST DE AUTOEVALUACION.</h2>
<?
/**************** funcin botonradio_db ****************/
/* $f conexin
*/
/* $tipo formato V=vertical ...
*/
/* $tabla1 tabla primera de consulta
*/
/* $tabla2 tabla segunda de consulta
*/
/*******************************************************/
function botonradio_db ($f, $tipo, $tabla1, $tabla2)
{
if ($tipo=="V")
$TIPO=" <BR>";
else $TIPO=" ";
$cons="SELECT max(id) FROM pregunta";
$res=mysql_query($cons, $f) OR die ("Fallo en la respuesta.");
$limite=mysql_result($res,0);
mysql_free_result($res);
$cons="SELECT id FROM pregunta";
$res = mysql_query($cons, $f) OR die ("Fallo en la respuesta.");
$num_ids=mysql_num_rows($res);
/* Este bucle for genera 6 numeros aleatorios de entre las posibles preguntas. */
/* Los nmeros as generados, son almacenados en la tabla @cadena, y sern usados*/
/* posteriormente, tanto para generar la cadena oculta de ids como para generar el
cdigo de */
/* las preguntas y sus opciones. Por precaucin, y para el correcto funcionamiento
del */
/*programa de gestin de la base de datos, se comprueba que los nmeros
aleatorios as
*/
/*generados coincidan con algn nmero de id.*/
for ($i = 0; $i < 6; $i++)
{
$j = 0;
$k = 0;
while (!$k)
{
$ale = mt_rand ("1","$limite");
$flag=0;
for ($v=0;$v<$num_ids;$v++){
$w=mysql_result($res,$v,0);
if ($ale==$w)$flag=1;
}
if ($flag)
{
$cadena[$i] = $ale;
if ($i == 0)
$k=1;
else
{
for ($k=0; $k<$i; $k++)
if ($cadena[$k] == $ale){
$k = 0;
break;
Pg. 325
}
}
}
else{
$k=0;
}
}
}
mysql_free_result($res);
/* Creacin del array oculto de ids */
$tab="";
for ($v = 0;$v<6;$v++) {
if ($v!=5) $tab=$tab.$cadena[$v].",";
else $tab=$tab.$cadena[$v];
}
/*Cdigo de la funcin*/
echo "<form action=\"solucion.php\" method=\"post\">\n";
echo "<table align=\"center\" width=\"95%\" cellpadding=0 cellspacing=0>\n";
for ($n=0;$n<6;$n++){
$l=$n+1;
$cons="SELECT texto from pregunta where id=\"$cadena[$n]\"";
$res=mysql_query($cons,$f) or die ("caca de la vaca");
$pre=mysql_result($res,0);
mysql_free_result($res);
echo "<tr><td colspan=2><p class=t1>\n";
print ("$l. $pre<br>\n</p></td></tr>\n");
$cons="SELECT opciona,opcionb,opcionc,opciond from opciones where
id=\"$cadena[$n]\"";
$res=mysql_query($cons,$f) or die ("caca de la vaca");
for ($m=0;$m<4;$m++){
$name="radio".$l;
$op=mysql_result($res,0,$m);
echo "<tr><td width=3% valign=\"top\">";
print ("<input type=\"radio\" name=\"$name\" value=\"$op\"></td>\n");
echo "<td><p class=t2>";
print ("$op</p></td></tr>\n");
}
mysql_free_result($res);
}
echo "<form action=\"solucion.php\" method=\"post\">\n";
echo "<table align=\"center\" width=\"95%\" cellpadding=0 cellspacing=0>\n";
echo "<tr><td colspan=2> </td></tr>";
echo "<tr><td align=\"center\" colspan=2>";
echo "<input type=\"hidden\" name=\"ids\" value=\"$tab\">";
echo "<p><input type=submit value=Corregir> ";
echo "<input type=reset value=Borrar></p>";
echo "</td></tr>";
echo "</table>";
echo "</form>";
}
/*********************************************************/
/***** Intentamos la conexin con la base de datos. *****/
/*********************************************************/
$base = $db_cuestionario;
$id = conectar();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos \"$base\". ");
?>
<?
botonradio_db($id, "V", "pregunta", "opciones");
mysql_close ($id);
/*print ("Se ha cerrado con xito.");*/
?>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
Pg. 326
2.46. /autoevaluacion/solucion.php
<?php
require('../config/config.php');
check_privs('cuestionario_r');
/*********************************************************/
/***** Intentamos la conexin con la base de datos. *****/
/*********************************************************/
$base = $db_cuestionario;
$f = conectar();
$conexion = mysql_select_db($base, $f) OR die ("No puedo conectar con la base de
datos \"$base\". ");
$contador=0;
$erroneas=0;
$sin=0;
$id=strtok($ids,",");
for ($k=1;$k<7;$k++){
$i = 0;
$j = 0;
$name = "radio".$k;
filtro_numerico($id);
$cons = "SELECT solucion FROM pregunta WHERE id=".$id;
$res = mysql_query ($cons,$f) or die ("Fallo en la respuesta buscando sol.");
$valor = mysql_result($res, $i, $j);
$opcion = "opcion".$valor;
$cons = "SELECT ".$opcion." FROM opciones WHERE id=".$id;
mysql_free_result($res);
$res = mysql_query ($cons,$f) or die ("Fallo en la respuesta buscando opcion.");
$valor = mysql_result ($res, $i, $j);
if (!(isset(${$name})))
$sin=$sin+1;
else if (strcmp(${$name},$valor) == 0)
$contador=$contador+1;
else
$erroneas=$erroneas+1;
mysql_free_result($res);
$id=strtok(",");
}
?>
<html>
<head>
<title>Autoevaluacion</title>
<style>
p.t1 {font: bold 13px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: 12px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
Pg. 327
2.47. /dudas/consultadudas.php
<?php
require('../config/config.php');
check_privs('dudas_r');
?>
<html>
<head>
<title>Tabla de dudas.</title>
<style>
Pg. 328
p.t1 {font: bold 14px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h1 align="center">Tabln de dudas</h1>
<h2 align="center">Respuestas:</h2>
<table width="90%" border="0" bgcolor="#007f40" align="center" cellspacing="1"
cellpadding="1">
<tr>
<td bgcolor="#88ddaa">
<table bgcolor="#007f40" width="100%" border=0 cellpadding=1 cellspacing=1
align="center">
<tr bgcolor="#88ddaa">
<td width="50% align="center"><p class=t1>Pregunta</p></td>
<td width="50%" align="center"><p class=t1>Respuesta</p></td></tr>
<?
/***************** Programa principal ****************/
/************************************************/
/* Estableciendo conexion con la base de datos. */
/************************************************/
$base = $db_dudas;
$id = conectar();
$conexion = mysql_select_db ($base, $id) OR die ("No puedo conectar con la base de
datos \"$base\".");
/* print ("Conexin establecida con xito.\n<br><br>\n"); */
$cons = "SELECT id FROM dudas";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
for ($i=0; $i<$k; $i++){
$name = "caja".$i;
if (!(isset(${$name}))) {
continue;
}
$kk=${$name};
filtro_numerico($kk);
if ($kk){
$cons = "SELECT pregunta,respuesta FROM dudas WHERE id='$kk'";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$valor = mysql_result($res,0,0);
echo "<tr bgcolor=\"#88ddaa\">\n<td><p class=t1>$valor</p></td>\n";
$valor = mysql_result($res,0,1);
echo "<td><p class=t1>$valor</p></td>\n</tr>";
}
}
mysql_free_result ($res);
mysql_close ($id);
/* print ("Se ha cerrado con xito."); */
?>
Pg. 329
</table>
</td></tr>
</table>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a href="tabladudas.php"><img border=0
src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
2.48. /dudas/tabladudas.php
<?php
require('../config/config.php');
check_privs('dudas_r');
?>
<html>
<head>
<title>Tabla de dudas.</title>
<style>
p.t1 {font: bold 14px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h1 align="center">Tabln de dudas</h1>
<form action="consultadudas.php" method="post">
<table width="90%" border="0" bgcolor="#007f40" align="center" cellspacing="1"
cellpadding="1">
<tr>
<td bgcolor="#88ddaa">
<table width="100%" bgcolor="#007f40" border=0 cellpadding=1 cellspacing=1
align="center">
<tr bgcolor="#88ddaa">
<td width="5%"> </td>
<td align="center"><p class=t1>Pregunta</p></td>
<td width="20%" align="center"><p class=t1>Fecha</p></td></tr>
<?
Pg. 330
*/
<?
/***************** Programa principal ****************/
/************************************************/
/* Estableciendo conexion con la base de datos. */
/************************************************/
$base = $db_dudas;
$id = conectar();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos \"$base\".");
tabladudas_db($id);
mysql_close ($id);
?>
<tr height="60px" bgcolor="#88ddaa"><td colspan=3><p align="center"><input
type=submit value=Consultar> <input type=reset
value=Borrar></td></tr>
</table>
</td></tr></table>
</form>
<br><br>
<table width="80%" cellpadding=2 cellspacing=3 align="center">
<tr><td colspan=3><p class=t2>Si no encuestras respuesta a tus dudas en este
tablón, por favor remítala al profesor de la asignatura. Él te
responderá con la mayor brevedad posible o bien podrás consultar tu
pregunta en este tablón en poco tiempo. Gracias.</p></td></tr>
<tr><td colspan=3 align="center"><a href="mailto:<?php echo $webmaster; ?>"><img
border="0" src="../images/correo03.gif" alt="Enviar correo"></a>
</td></tr>
</table>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img
border=0 src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
Pg. 331
2.49. /encuesta/encuesta.php
<?php
require('../config/config.php');
check_privs('encuesta_r');
?>
<html> <head> <title>Encuesta.</title>
<META HTTP-EQUIV="Expires" CONTENT="Tue, 01 Jan 1980 1:00:00 GMT"> <META HTTPEQUIV="Pragma" CONTENT="no-cache">
<style type="text/css">
<!-- #ayuda {POSITION: absolute; VISIBILITY: hidden; TOP: 180px; LEFT: 200px; ZINDEX: 1;} //-->
A.t1 {font: bold 12px Times New Roman; line-height:15px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
A.t1:visited {font: bold 12px Verdana , Arial; line-height:15px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
A.t1:hover {font: bold 12px Times New Roman; line-height:15px; color:#00874F;
background:#E4E4A5}
A.t2 {font: bold 16px Times New Roman; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
A.t2:visited {font: bold 16px Verdana , Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
A.t2:hover {font: bold 16px Times New Roman; line-height:18px; color:#00874F;
background:#E4E4A5} p.t1 {font: bold 12px Times New Roman; line-height:15px;
color:#000000; TEXT-DECORATION: none;text-indent:2px}
p.t2 {font:
12px Times New Roman; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t3 {font:
10px Times New Roman; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
li.t1 {font:
12px Times New Roman; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
<script language=Javascript>
function Apareceform(){
form.style.visibility='visible';
return true;
}
function Desapareceform(){
form.style.visibility='hidden';
return true;
}
function muestra(capa) { if (navigator.appName == "Netscape") {
document.capa.visibility="visible"; } else {
document.all[capa].style.visibility="visible"; } } function oculta(capa) { if
(navigator.appName == "Netscape") {
document.capa.visibility="hidden"; } else {
document.all[capa].style.visibility="hidden"; } }
</script>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<a name="#top"></a>
<table border="0" width="761">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img
src="../images/gte_small_ani.gif" alt="Grupo de Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php echo
$nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img
src="../images/gte_small_ani.gif" alt="Grupo de Tecnologa Electrnica">
</td>
</tr> </table> <hr>
<h2 align="center"><a href="#top" onClick="muestra('ayuda');"><img
src="../images/t_encuesta.gif" alt="Ayuda" border=0></a></h2>
<div id="ayuda"> <table border=0 cellpadding=2 cellspacing=1 bgcolor="#123456"
width="70%">
<tr><td bgcolor="#ffcd5c">
<table align="center" cellpadding=2 cellspacing=2> <tr><td><p class=t1>Ayuda para
rellenar la encuesta</p></td></tr> <tr><td><p class=t2> La encuesta se divide en tres
bloques diferentes:</p> <ul> <li class=t1>Actitudes personales</li> <li
class=t1>Competencia expositiva</li> <li class=t1>Aspectos objetivos de
preparacion</li> </ul> <p class=t2>Cada uno de ellos debe ser ponderado de forma
global del 1 al 10, teniendo en cuenta que la suma de los tres valores debe ser 10.
Introducir cada uno de estos valores en la casilla que se encuentra a la derecha del
ttulo de cada bloque.</p> <p class=t2>Cada bloque consta de un nmero variable de
Pg. 332
comentarios ms especficos con los que puede estar Muy en desacuerdo, En desacuerdo,
Indiferente, De acuerdo o Muy de acuerdo. Seleccione el que considere oportuno y
marque la casilla correspondiente.</p> <p class=t2>Debers responder a la encuesta
por completo y siguiendo estas reglas. En caso contrario la encuesta no ser
vlida.</p> <p class=t2>Tambin se te ofrece la posibilidad de incluir alguna
sugerencia o comentario que consideres oportuno para mejorar la asignatura. Usa para
ello el cuadro de la parte inferior de la encuesta.</p> <p class=t2>Por ltimo, te
recuerdo de nuevo que los datos son completamente confidenciales y que la informacin
relativa a tu nombre y D.N.I. slo se usa para permitir el acceso, y no queda
constancia de ellos una vez permitido el mismo.<br><br> </p></td></tr>
<tr><td align="center"><a class=t1 href="#top" OnClick="oculta('ayuda');">Pulse para
cumplimentar la encuesta</a></td></tr>
</table>
</td></tr> </table> </div>
<form action=tomadatos.php method=post >
<table border="0" width="95%" align="center" bgcolor="#007f40" cellpadding=2
cellspacing=1>
<tr><td bgcolor="#ffffff">
<table width=100% cellpadding=1 cellspacing=1 align="center" bgcolor="#007f40">
<tr bgcolor="#ffffff"> <td width=50%> </td>
<td width=10%><p class=t3>Muy en
desacuerdo</td> <td width=10%><p class=t3>Desacuerdo</td> <td width=10%><p
class=t3>Indiferente</td> <td width=10%><p class=t3>De acuerdo</td>
<td
width=10%><p class=t3>Muy de acuerdo</td> </tr> <tr bgcolor="#ffffff">
<td
colspan=5> <p class=t1>ACTITUDES PERSONALES</p></td>
<td><input TYPE="text" align=rigth NAME="valor1" SIZE="1" MAXLENGTH="1" VALUE="<? if
(isset($valor1)) { echo $valor1; }
?>" > </td></tr>
<? echo "<tr bgcolor=\"#ffffff\"> <td ><p class=t2>El profesor es educado y
respetuoso con los alumnos </p></td>";
echo "<td><input type=\"radio\" name=\"pregunta1\" value=\"1\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta1\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta1\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta1\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta1\" value=\"5\" ></td>";
echo "<tr bgcolor=\"#ffffff\"> <td><p class=t2>El profesor intenta motivar a los
alumnos por la asignatura</p> </td>";
echo "<td><input type=\"radio\" name=\"pregunta2\" value=\"1\"></td>";
echo "<td><input type=\"radio\" name=\"pregunta2\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta2\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta2\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta2\" value=\"5\" ></td>";
echo "<tr bgcolor=\"#ffffff\"> <td><p class=t2>El profesor muestra interes en que los
alumnos comprendan las explicaciones </p></td>";
echo "<td><input type=\"radio\" name=\"pregunta3\" value=\"1\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta3\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta3\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta3\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta3\" value=\"5\" ></td>";
echo "<tr bgcolor=\"#ffffff\"> <td><p class=t2>El profesor esta abierto a las
sugerencias de los alumnos </p></td>";
echo "<td><input type=\"radio\" name=\"pregunta4\" value=\"1\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta4\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta4\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta4\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta4\" value=\"5\" ></td>";
echo "<tr bgcolor=\"#ffffff\"> <td><p class=t2>El profesor fomenta la participacion
en clase </p></td>"; echo "<td><input type=\"radio\" name=\"pregunta5\" value=\"1\"
></td>";
echo "<td><input type=\"radio\" name=\"pregunta5\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta5\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta5\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta5\" value=\"5\" ></td>";
echo "<tr bgcolor=\"#ffffff\"> <td><p class=t2>Las clases son amenas </p></td>";
echo "<td><input type=\"radio\" name=\"pregunta6\" value=\"1\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta6\" value=\"2\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta6\" value=\"3\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta6\" value=\"4\" ></td>";
echo "<td><input type=\"radio\" name=\"pregunta6\" value=\"5\" ></td>";
Pg. 333
Pg. 334
Pg. 335
2.50. /encuesta/tomadatos.php
<?php
require('../config/config.php');
check_privs('encuesta_r');
?>
<html> <head> <title>Encuesta.</title>
</head>
Pg. 336
Pg. 337
2.51. /login/login.php
<?php
// El fichero ser llamado desde un "include" y necesitamos diversas variables que se
// definieron en el script llamante. Para que sean accesibles aqu, las declaramos
"global".
global $PHP_SELF, $portal, $db_usuarios, $username, $password, $enviar;
if (isset($enviar)) {
/*************************/
/** Procesar formulario **/
/*************************/
require_once ('../config/config.php');
conectar();
mysql_select_db($db_usuarios);
// Nos aseguramos de que no hay caracteres "raros" en $username
if (!filtro_alfanumerico($username)) {
$hash_password = md5($password);
$result = mysql_query("select * from cuentas where user = '$username' and pass =
'$hash_password'");
if (mysql_numrows($result) == 1) {
$cuenta = mysql_fetch_array($result);
// Leemos los permisos del usuario asociado
$result = mysql_query("select * from permisos where user = '$username'");
if (mysql_numrows($result) != 1) {
die ("ERROR: Inconsistencia en la base de datos de usuarios: no encuentro los
datos de permisos para el usuario dado. Contacte con el administrador.");
}
// Construimos el array de permisos leyendo directamente la tabla de permisos y
quitando
// el campo "user", que realmente no es un permiso (sino el ndice de la tabla)
$permisos = mysql_fetch_assoc($result);
unset ($permisos['user']);
// Guardamos los datos del usuario en variables de sesin
session_start();
$_SESSION['portal'] = $portal;
$_SESSION['user'] = $cuenta['user'];
$_SESSION['realname'] = $cuenta['realname'];
$_SESSION['permisos'] = $permisos;
header ("Location: $PHP_SELF");
// Recargamos la pgina
Pg. 338
exit;
cdigo por debajo
}
}
// Si la autentificacin tuvo xito terminamos en el "exit" anterior y no llegamos a
este punto.
// En caso contrario mostraremos el formulario.
/*************************/
/** Formulario de LOGIN **/
/*************************/
// Por si acaso queda alguna sesin "viva", borramos las posibles variables
existentes
session_start();
session_unset();
?>
<html>
<head>
<title> Identificación de usuario</title>
</head>
<body background="../images/fondo_err.jpg">
<style type="text/css">
a:link{color: #004433; text-decoration: underline;}
a:visited{color: #004433; text-decoration: underline;}
a:active{color: #004433; text-decoration: underline;}
a:hover{color: #004433; text-decoration: underline;}
body{font-family: Verdana; font-size: 8pt; background: <?php echo
$GLOBALS['colorbg']; ?>; color: #004433;}
td,p{font-family: Verdana; font-size: 8pt;}
textarea,select,input{background:#99ccaf; color: #004433; FONT-FAMILY:
Verdana; FONT-SIZE: 10px; BORDER-BOTTOM: 1px #007f40 solid; BORDER-LEFT: 1px #007f40
solid; BORDER-RIGHT: 1px #007f40 solid; border-top: 1px #007f40 solid;}
.border{background: #007f40;}
.main{background: #99ccaf;}
.child{background: #80a3c5;}
</style>
<br><br>
<table width="75%" class=border cellspacing="1" cellpadding="0" align="center">
<tr>
<td align="center" class=main height="31">
<table width="100%" border="0">
<tr>
<td width="16%"><font color="99ccaf"><center><b><img
src="../images/gte_small_ani.gif"></b></center></font></td>
<td align="center"><font color="000000"><b>Identificación de
usuario</b></font></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center" class=main height="97">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="296" width="2%" bgcolor="#99ccaf"> </td>
<td height="296" width="98%">
<p align="center">
<?php
if (isset($GLOBALS['badlogin'])) {
Pg. 339
<tr>
<td align="right" width="50%" valign="middle"
height="32">Usuario: <br>
</td>
<td width="50%" valign="middle" height="32">
<input type="text" name="username" maxlength="16">
<br>
</td>
</tr>
<tr>
<td align="right" width="50%"
height="10">Contraseña:
</td>
<td width="50%" height="10">
<input type="password" name="password" maxlength="16">
</td>
<input type="hidden" name="badlogin" value="1">
</tr>
<tr align="center">
<td colspan="2" height="48"> <br>
<input type="submit" name="enviar" value="Login">
<br>
</td>
</tr>
</table>
</div>
</form>
<div align="center">
Si has olvidado tu contrasea, ponte en contacto con el <a href=<?php
echo "mailto:".$GLOBALS['webmaster']; ?>>Webmaster</a>.
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td colspan=4> </td>
</tr>
<tr>
<td width="50%" align="right"><a
href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
Pg. 340
2.52. /msg/err_db_connection.html
<head>
<title>ERROR: Fallo al conectar con la base de datos</title>
</head>
<body background="../images/fondo_err.jpg">
<h1 align="center"><font color="#FF0000">ERROR: Fallo al conectar con la base de
datos.</font></h1>
<hr>
<p> </p>
<p style="line-height: 200%"> Este error puede ser debido a una de
las siguientes
razones:</p>
<ol>
<li>La base de datos est caida. Por favor, reintntelo ms tarde. En caso de
persistir el error
pngase en contacto con el Administrador.<br>
</li>
</ol>
<p> </p>
<hr>
2.53. /msg/err_noprivs.php
<html>
<head>
<title>ERROR: No tiene privilegios suficientes.</title>
<style>
p.t1 {font: bold 16px Verdana, Arial; line-height:18px; color:#007f40; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 13px/15px Verdana, Arial; color:#000000; TEXT-DECORATION: none;textindent:2px}
p.t3 {font: 11px times new roman, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
LI {font: bold 13px Verdana, Arial; line-height:15px; color:#000000; TEXT-DECORATION:
none;text-indent:2px}
A:link,
A:active,
A:visited {COLOR: #115544; TEXT-DECORATION: none}
A:hover {BACKGROUND-COLOR: #ffffdd; COLOR: black; TEXT-DECORATION: none}
</style>
</head>
<body bgcolor=<?php echo $GLOBALS['colorbg']; ?> text="#000000" link="#004433"
vlink="#004433" alink="#004433">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $GLOBALS['nombre_portal']; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
Pg. 341
<hr>
<p>
<table width="90%" align="center" cellpadding=1 cellspacing=2>
<tr>
<td bgcolor=#007f40>
<table width=100% border=0 cellpadding=2 cellspacing=4 align="center"
bgcolor="#99CCAF">
<tr>
<td> </td>
</tr>
<tr>
<td width="49%">
<div align="center">
<p class="t1">Lo sentimos pero no tiene suficientes privilegios para
acceder a este servicio.</p>
</div>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</td>
</tr>
</table>
<br><br>
<?php
if (isset($_SESSION['user'])) {
?>
<h4 align="center">Actualmente se encuentra autentificado como usuario "<?php
echo $_SESSION['user']; ?>".</h4>
<?php
}
?>
<h4 align="center">Si lo desea, puede iniciar una <a href=<?php echo
$GLOBALS['PHP_SELF']."?relogin=1"; ?> target="_top">nueva sesión</a>
y cambiar de identidad.</h4>
<?php
pie("", "http://www.gte.us.es/~fbarrero/CSED/");
?>
</body>
</html>
2.54. /notas/notas.php
<?php
require('../config/config.php');
check_privs('notas_r');
if ($notas_publicadas == 0) {
include ("notas_np.php");
exit;
}
?>
<html>
Pg. 342
<head>
<title>Notas.</title>
<style>
p.t1 {font: bold 14px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<table align="center" width=90% cellpading=1 cellspacing=1>
<tr><td bgcolor=<?php echo $colorbg; ?>>
<table align="center" width=90% cellpading=1 cellspacing=1>
<?
$base = $db_notas;
$id = conectar();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
echo "<tr bgcolor=<$colorbg><td colspan=2 bgcolor=$colorbg><table width=100%
cellpadding=0 cellspacing=0><tr bgcolor=$colorbg>";
$sql="SELECT * from datos";
$res=mysql_query($sql,$id) or die ("Fallo al tomar datos examen");
$valor=mysql_result($res,0,0);
print ("<td align=\"left\" width=\"25%\" bgcolor=$colorbg><p
class=t2>Curso:$valor</p></td>");
$valor=mysql_result($res,0,1);
print ("<td align=\"center\" width=\"35%\" bgcolor=$colorbg><p
class=t2>Convocatoria:$valor</p></td>");
$valor=mysql_result($res,0,2);
print ("<td bgcolor=$colorbg width=\"40%\" align=\"right\"><p class=t2>Fecha de
publicacin:$valor</p></td></tr><tr bgcolor=$colorbg><td> </td></tr></table>");
echo "<tr bgcolor=$colorbg><td bgcolor=$colorbg colspan=2><p
class=t1 align=\"justify\">Las notas aqu publicadas tienen carcter provisional y
meramente
informativo. Las definitivas sern publicadas en el tabln de anuncios del
Departamento de Ingeniera Electrnica</p></td></tr>";
echo "<tr bgcolor=$colorbg><td bgcolor=$colorbg
colspan=2> </td></tr>";
$sql ="SELECT alumno,nota FROM notas";
$res=mysql_query($sql,$id) or die ("Fallo en la toma de datos");
$n=mysql_num_rows($res);
for ($i=0;$i<$n;$i++)
{
$valor = mysql_result($res,$i,0);
echo "<tr bgcolor=$colorbg><td bgcolor=$colorbg><p class=t2>$valor</p></td>\n";
$valor = mysql_result($res, $i,1);
print ("<td bgcolor=$colorbg><p class=t1>$valor</p></td>\n");
}
mysql_free_result($res);
mysql_close($id);
?>
</table>
Pg. 343
</td></tr></table>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img
border=0 src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</BODY>
</HTML>
2.55. /notas/notas_np.php
<?php
require_once('../config/config.php');
check_privs('notas_r');
?>
<!doctype html public "-//w3c//dtd html 3.2//en">
<html>
<head> <title>Notas</title>
<meta name="GENERATOR" content="Arachnophilia 4.0">
<meta name="FORMATTER" content="Arachnophilia 4.0">
</head>
<body bgcolor=<?php echo $colorbg; ?> text="#000000" link=<?php echo $colorbg; ?>
vlink=<?php echo $colorbg; ?> alink="#ff0000">
<table border="0" width="100%">
<tr>
<td valign="top">
<p align="center"> <img src="../images/gte_small_ani.gif" alt="Grupo de Tecnologa
Electrnica">
</td>
<td bgcolor=<?php echo $colorbg; ?>> <b><font face="Arial" color="#006666" size="3">
<small><?php echo $nombre_portal; ?></small></font> </b></td>
</tr>
</table>
<hr>
<b><h1><center>Aún no hay notas disponibles. </center></h1></b>
<table align="center" border=0>
<tr><td valign="top"><p align="center" class=t4>Volver al Inicio</td></tr>
<tr><td valign="bottom" align="center"><a
href="http://www.gte.us.es/~fbarrero/CSED/">
<img src="../images/hazhome[1].gif" border=0></a></p></td> </tr>
</table> </td></tr></table> </body> </html>
2.56. /noticias/consultanoticias.php
<?php
require('../config/config.php');
check_privs('noticias_r');
?>
<html>
<head>
<title>Consulta de noticias.</title>
<style>
p.t1 {font: bold 14px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
Pg. 344
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor="#99cccc">
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h1 align="center">Tabln de noticias</h1>
<h2 align="center">Comentarios</h2>
<table width="90%" border="0" bgcolor="#007f40" align="center" cellspacing="1"
cellpadding="1">
<tr>
<td bgcolor="#88ddaa">
<table bgcolor="#007f40" width="100%" border=0 cellpadding=1 cellspacing=1
align="center">
<tr bgcolor="#88ddaa">
<td width="50% align="center"><p class=t1>Noticia</p></td>
<td width="50%" align="center"><p class=t1>Comentario</p></td></tr>
<?
/***************** Programa principal ****************/
/************************************************/
/* Estableciendo conexion con la base de datos. */
/************************************************/
$base = $db_noticias;
$id = conectar();
$conexion = mysql_select_db ($base, $id) OR die ("No puedo conectar conla base de
datos \"$base\". ");
$cons = "SELECT id FROM noticias";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
for ($i=0; $i<$k; $i++){
$name = "caja".$i;
if (!(isset(${$name}))) {
continue;
}
$kk=${$name};
filtro_numerico($kk);
if ($kk){
$cons = "SELECT noticia,comentario FROM noticias WHERE id='$kk'";
$res = mysql_query ($cons, $id) OR die ("Fallo en la respuesta.");
$valor = mysql_result($res,0,0);
echo "<tr bgcolor=\"#88ddaa\">\n<td><p class=t1>$valor</p></td>\n";
$valor = mysql_result($res,0,1);
echo "<td><p class=t1>$valor</p></td>\n</tr>";
}
}
mysql_free_result ($res);
mysql_close ($id);
?>
</table>
</td></tr>
</table>
Pg. 345
2.57. /noticias/noticias.php
<?php
require('../config/config.php');
check_privs('noticias_r');
?>
<html>
<head>
<title>Tabla de noticias.</title>
<style>
p.t1 {font: bold 14px Verdana, Arial; line-height:18px; color:#000000; TEXTDECORATION: none;text-indent:2px}
p.t2 {font: bold 12px Verdana, Arial; line-height:15px; color:#000000; TEXTDECORATION: none;text-indent:2px}
</style>
</head>
<body bgcolor=<?php echo $colorbg; ?>>
<table border="0" width="100%">
<tr>
<td valign="top" width=10%>
<p align="center" class=t1><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
<td align="center"> <b><font face="Arial" color="#000000" size="4"><small><?php
echo $nombre_portal; ?></small></font> </b></td>
<td valign="top" width=10%>
<p align="center"><img src="../images/gte_small_ani.gif" alt="Grupo de
Tecnologa Electrnica">
</td>
</tr>
</table>
<hr>
<h1 align="center">Tabln de noticias</h1>
<form action="consultanoticias.php" method="post">
<table width="90%" border="0" bgcolor="#007f40" align="center" cellspacing="1"
cellpadding="1">
<tr>
<td bgcolor=<?php echo $colorbg; ?>>
<table width="100%" bgcolor="#007f40" border=0 cellpadding=1 cellspacing=1
align="center">
<tr bgcolor=<?php echo $colorbg; ?>>
<td width="5%"> </td>
<td align="center"><p class=t1>Noticia</p></td>
<td width="20%" align="center"><p class=t1>Fecha</p></td></tr>
<?
/**************** funcin tablanoticias_db ****************/
/* Muestra una tabla con todas las dudas almacenadas
*/
/* en la base de datos.
*/
/* $f conexin*/
Pg. 346
/****************************************************/
function tablanoticias_db ($f){
global $colorbg;
$cons = "SELECT id,noticia,fecha FROM noticias ";
$res = mysql_query ($cons, $f) OR die ("Fallo en la respuesta.");
$k = mysql_num_rows ($res);
for ($i=0; $i<$k; $i++){
$numid = mysql_result($res, $i, 0);
$valor = mysql_result($res, $i, 1);
$name = "caja".$i;
echo "<tr bgcolor=$colorbg>\n<td><p class=t1><input type=checkbox name=\"$name\"
value=\"$numid\"></td>\n<td><p class=t1>$valor</p></td>\n";
$valor = mysql_result($res, $i, 2);
echo "<td valign=\"middle\"><p class=t1>\"$valor\"</p></td>\n</tr>\n";
}
mysql_free_result($res);
}
?>
<?
/***************** Programa principal ****************/
/************************************************/
/* Estableciendo conexion con la base de datos. */
/************************************************/
$base = $db_noticias;
$id = conectar();
$conexion = mysql_select_db($base, $id) OR die ("No puedo conectar con la base de
datos $base. ");
tablanoticias_db($id);
mysql_close ($id);
?>
<tr height="60px" bgcolor=<?php echo $colorbg; ?>><td colspan=3><p
align="center"><input type=submit value=Consultar> <input type=reset
value=Borrar></td></tr>
</table>
</td></tr></table>
</form>
<br><br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr><td colspan=4> </td></tr>
<tr>
<td width="10%" align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img
border=0 src="../images/atras.gif" width="17" height="16" alt=""></a></td>
<td width="25%" ><font size="-1"><b>Atrs</b></font></td>
<td align="right"><a href="http://www.gte.us.es/~fbarrero/CSED/"><img border=0
src="../images/hazhome[1].gif" width="26" height="26" alt=""></a></td>
<td><b>Volver al inicio</b> </td>
</tr>
</table>
</body>
</html>
2.58. /index.html
<!doctype html public "-//w3c//dtd html 3.2//en"><html>
<head profile="http://www.gte.us.es/~fbarrero/CSED/">
<meta name="title" content="Complementos de Sistemas Electrnicos Digitales">
<meta name="author" content="Jos Miguel Ruiz">
<link rev="made" href="mailto:fbarrero@gte.esi.us.es">
<meta name="keywords" content="electronica, docencia, enseanza, sistemas,
, DSP, universidad, ingenieria, complementos, digitales, electronicos">
<meta name="description" content="Portal de Internet de la asignatura
Pg. 347
Pg. 348
Pg. 349
</table>
</DIV>
<DIV Id="ayuda2" STYLE="width:450px;height:302px;text-align:justify;backgroundcolor:#119900;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> En esta seción encontrar un sistema de acceso al
temario completo de la asignatura en formato web. El sistema de navegacin est
diseado para que el acceso a cada apartado sea similar al utilizado en el sistema de
archivos de Windows. Pulsando sobre una carpeta cerrada, sta se abre y podemos
acceder a su contenido.<br>
As mismo, desde esta pgina podr acceder a una zona de descarga de
apuntes en la que encontrar los apuntes de cada tema en formato PDF.
</td></tr>
</table>
</DIV>
<DIV Id="ayuda3" STYLE="width:450px;height:302px;text-align:justify;backgroundcolor:#44cc44;">
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> Esta seccin le permitir acceder a la realizacin de un
pequeo test de seis preguntas en el que podr usted responder a cuestiones de la
asignatura y poner a prueba sus conocimientos relativos al temario de la
misma.</td></tr>
</table>
</DIV>
<DIV Id="ayuda4" STYLE="width:450px;height:302px;text-align:justify;
background-color:#ccffcc;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> Desde esta pgina, tendr acceso a una base de datos en la
que se irn respondiendo las dudas que con ms frecuencia tengan los alumnos sobre
conceptos de la asignatura.<br> Tambin se le ofrece la posibilidad de
realizar consultas va e-mail, si no encuentra su duda entre las
publicadas.</td></tr>
</table>
</DIV>
<DIV Id="ayuda5" STYLE="width:450px;height:302px;text-align:justify;
background-color:#007f40;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> Aqu podr usted ver publicadas las notas de la asignatura.
Se recuerda el carcter meramente informativo de lo publicado en esta
pgina.</td></tr>
</table>
</DIV>
<DIV Id="ayuda6" STYLE="width:450px;height:302px;text-align:justify;
background-color:#ccee00;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> Esta seccin contiene una encuesta sobre la calidad de la
enseanza de la asignatura. El acceso a la realizacin de la misma est restringido a
alumnos matriculados en esta asignatura. Para acceder deber usted introducir su
apellido y D.N.I., pero estos datos slo sern utilizados para verificar su identidad
y asegurar que slo accede una vez a la encuesta. Una vez certificado que tiene
acceso, sus datos son eliminados y no queda ningn registro de los mismos. Se ruega
que conteste con la mayor sinceridad posible, ya que los resultados sern analizados
con el objetivo de tratar de mejorar la calidad de la asignatura.</td></tr>
</table>
</DIV>
<DIV Id="ayuda7" STYLE="width:450px;height:302px;text-align:justify;
background-color:#33ff44;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br>Aqu aparecer toda la informacin que de alguna forma pueda ser
considerada una noticia :<ul> <li> Conferencias
<li> Seminarios
<li>
Convocatorias a examen <li> Convocatorias a oposiciones
<li> Fechas de publicacin
de notas
<li> Fecha de entrega de prcticas</ul></td></tr>
</table>
Pg. 350
</DIV>
<DIV Id="ayuda8" STYLE="width:450px;height:302px;text-align:justify;
background-color:#335588;" >
<table align="center" width=90% cellpadding=2 cellspacing=3>
<tr><td align="center"><br><u><b>Ayuda</b></u><br></td></tr>
<tr><td><br> Acceda a esta seccin para llevar a cabo diversas tareas
administrativas (cambio de contrasea, etc).</td></tr>
</table>
</DIV>
</body></html>
2.59. /temario.html
<!doctype html public "-//w3c//dtd html 3.2//en">
<html>
<head>
<title>
Temario
</title>
<style>
BODY
{
scrollbar-3d-light-color: #FF9933; scrollbar-arrow-color: Black; scrollbar-basecolor: Black; scrollbar-dark-shadow-color: #367CC2; scrollbar-face-color: #5894D0;
scrollbar-highlight-color: ThreedLightShadow; scrollbar-shadow-color: InactiveCaption
}
A:link {
COLOR: black; FONT-FAMILY: times new roman; FONT-SIZE: 11pt; TEXT-DECORATION: none
}
TD {
COLOR: black; FONT-FAMILY: times new roman; FONT-SIZE: 11pt
}
A {
COLOR: black; FONT-FAMILY: times new roman; FONT-SIZE: 11pt
}
A:hover {
BACKGROUND-COLOR: #99ccff; COLOR: blue; FONT-FAMILY: times new roman; TEXTDECORATION: none
}
A:active {
COLOR: #0E0B76; FONT-FAMILY: times new roman; TEXT-DECORATION: none
}
A:visited {
FONT-FAMILY: times new roman; TEXT-DECORATION: none
}
</style>
<SCRIPT LANGUAGE="JavaScript">
// **funciones que establecen objetos y entorno**
// constructor del array basico
function makeArray(n) {
this.length = n
return this
}
// constructor de objeto para cada entrada
// (see object-building calls, below)
function dbRecord(mother,display,URL,indent){
this.mother = mother
// is this item a parent?
this.display = display // text to display
this.URL = URL
// link tied to text
this.indent = indent
// how deeply nested?
Pg. 351
return this
}
// create object containing outline content and attributes
// To adapt outline for your use, modify this table. Make sure
// that the size of the array (db[i]) is reflected in the call
// to makeArray(i). See the dbRecord() function, above, for the
// meaning of the four parameters in each array entry.
var db = new makeArray(39)
db[1] = new dbRecord(true, "TEMA 1. INTRODUCCIN A LOS PROCESADORES DIGITALES DE
SEAL (DSPs). CONCEPTOS BSICOS.","tema1/tema1.html",0)
db[2] = new dbRecord(false, "1 Introduccin e historia.","tema1/punto1.html",1)
db[3] = new dbRecord(false, "2 Principales aplicaciones de los
DSPs.","tema1/punto2.html",1)
db[4] = new dbRecord(false, "3 Estructura interna basica de un
DSP.","tema1/punto3.html",1)
db[5] = new dbRecord(false, "4 Principales fabricantes de
DSPs.","tema1/punto4.html",1)
db[6] = new dbRecord(true, "TEMA 2. FAMILIA DE DSPs TMS320C3x DE TEXAS INSTRUMENTS.
CONCEPTOS BSICOS DEL HARDWARE.","tema2/tema2.html",0)
db[7] = new dbRecord(false, "1 Introduccion.","tema2/punto1.htm",1)
db[8] = new dbRecord(false, "2 Descripcion general del
sistema.","tema2/punto2.htm",1)
db[9] = new dbRecord(true, "3 Unidad central de control de procesos
(CPU).","tema2/punto3.htm",1)
db[10] = new dbRecord(false,"3.1 Registros internos de la CPU.","tema2/punto31.htm",2)
db[11] = new dbRecord(false, "4 Operaciones internas del bus.","tema2/punto4.htm",1)
db[12] = new dbRecord(true, "5 Organizacion de la memoria.","tema2/punto5.htm",1)
db[13] = new dbRecord(false, "5.1 Reset y Vectores de Interrupcion.","tema2/punto51.htm",2)
db[14] = new dbRecord(false, "5.2 Periferico Memoria Cache.","tema2/punto5-2.htm",2)
db[15] = new dbRecord(false, "5.3 Arranque programado en el TMS320C31: BootLoader.","tema2/punto5-3.htm",2)
db[16] = new dbRecord(true, "6 Operaciones externas del bus.","tema2/punto6.htm",1)
db[17] = new dbRecord(false, "6.1 Estructura Master-Slave en un sistema
microprocesador.","tema2/punto6.htm",2)
db[18] = new dbRecord(false, "6.2 Diagramas de tiempos y estados de
espera.","tema2/punto6-2.htm",2)
db[19] = new dbRecord(false, "6.3 Tiempo de ejecucion y tiempo de
acceso.","tema2/punto6-3.htm",2)
db[20] = new dbRecord(false, "6.4 Peculiaridades en el acceso a
perifericos.","tema2/punto6-4.htm",2)
db[21] = new dbRecord(true, "TEMA 3. FAMILIA TMS320C3x. DESCRIPCION DEL
SOFTWARE.","tema3/tema3.html",0)
db[22] = new dbRecord(false, "1 Introduccin.","tema3/punto1.html",1)
db[23] = new dbRecord(false, "2 Formato de datos.","tema3/punto2.htm",1)
db[24] = new dbRecord(false, "3 Modos de direccionamiento.","tema3/punto3.html",1)
db[25] = new dbRecord(false, "4 Pila.","tema3/punto4.html",1)
db[26] = new dbRecord(false, "5 Sumario de instrucciones.","tema3/punto5.htm",1)
db[27] = new dbRecord(true, "TEMA 4. FAMILIA TMS320C3x: PERIFERICOS
INTERNOS.","tema4/tema4.htm",0)
db[28] = new dbRecord(false, "1 Introduccin.","tema4/punto1.html",1)
db[29] = new dbRecord(false, "2 Entradas-salidas digitales: XF0,
XF1.","tema4/punto2.html",1)
db[30] = new dbRecord(true, "3 Temporizadores.","tema4/punto3.html",1)
db[31] = new dbRecord(false, "3.1 Registros de control y
configuracin.","tema4/punto3-1.html",2)
db[32] = new dbRecord(false, "3.2 Estructura interna y configuracin del perifrico
temporizador.","tema4/punto3-2.html",2)
db[33] = new dbRecord(true, "4 Puertos serie sincronos.","tema4/punto4.html",1)
db[34] = new dbRecord(false, "4.1 Registros de control y
configuracin.","tema4/punto4-1.html",2)
db[35] = new dbRecord(false, "4.2 Estructura interna y configuracin del perifrico
puerto serie.","tema4/punto4-2.html",2)
db[36] = new dbRecord(false, "4.3 Modos de operacin: Diagramas de
tiempo.","tema4/punto4-3.html",2)
db[37] = new dbRecord(true, "5 Controlador DMA.","tema4/punto5.html",1)
Pg. 352
Pg. 353
}
return "Pulsa para abrir la carpeta."
Pg. 354
alt="">
<td
align="left" valign="bottom">
<h4 ><A
href="http://www.gte.us.es/fbarrero/csed/download/">ZONA DE DESCARGA DE APUNTES Y
PROBLEMAS RESUELTOS.</A></h4>
</td>
</tr>
</table>
<table width="75%" border="0" cellspacing="0" cellpadding="0">
<tr></tr>
<tr>
<td width=20% align="center">
<img src="images/downloads[1].gif" width="61" height="44"
alt="">
<td
align="left" valign="bottom">
<h4><A href="practicas.html">ZONA DE DESCARGA DE
PRCTICAS.</A></h4>
</td>
</tr>
</table>
<br>
<br>
<br>
<p>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td width="10%" align="right">
<a href="index.html"><img src="images/atras.gif" width="17"
height="16" alt=""></a>
<td width="25%" ><font size="-1"><b>Atrs</b></font>
<td
align="right">
Pg. 355
Pg. 356
Bibliografa
Bibliografa
1. Libros.
Douglas E. Comer. Redes globales de informacin con Internet y TCP/IP.
Principios bsicos, protocolos y arquitectura. Prentice-Hall. 3 Edicin,
1996. ISBN: 968-880-541-6.
Douglas E. Comer and David L. Stevens. Interconectividad de redes con
TCP/IP. Volumen II. Diseo e implementacin. Prentice Hall. 3 Edicin,
2000. ISBN: 970-26-0000-6.
Andrew S. Tanenbaum. Redes de computadoras. Pearson. 3 Edicin,
1997. ISBN: 968-880-958-6.
Joel Scambray, Stuart McClure and George Kurtz. Hackers 2. Secretos y
soluciones para la seguridad de redes. McGraw-Hill. 1 Edicin, 2001.
ISBN: 84-481-3187-8.
Rain Forest Puppy, Elias Levy, Blue Boar, Dan Kaminsky, Oliver
Friedrichs, Riley Eller, Greg Hoglund, Jeremy Rauch and Georgi
Guninsky. Hack proofing your network: internet tradecraft. Syngress.
2000. ISBN: 1-928994-15-6.
Robert L. Ziegler. Gua avanzada. Firewalls Linux. Prentice Hall.
Madrid, 2000. ISBN: 84-205-2949-4.
Pg. 357
Bibliografa
Pg. 358
Bibliografa
Pg. 359
Bibliografa
Pg. 360