):
Aqui empieza el area secretac/p>"; t Sin embargo, este ejemplo todavia presenta dos “agujeros de seguridad”: * La contrasefia se puede leer directamente en. el cédigo del archivo PHP. + Elérea secreta también se encuentra en el propio archivo PHP. LY cuél es el problema? Al fin y al cabo, el servi- dor web nunca muestra el cédigo PHP tal cual. El usuario siempre recibe una pagina HTML “montada’, en la que se ocultan todos los pasa- jes secretos. En ese caso, la pagina PHP ya no se interpretaré, sino que se mostraré “directamente”. Y las con- trasefias y los datos secretos no tendran nada de secretos, se podrén ver directamente. Por ese motivo, cualquier programador profe- sional se atiene a una regla basica: las contrase- as 0 datos de acceso deben guardarse en archi- vos externos. Dichos archivos no deben encon- trarse en carpetas accesibles al ptiblico. ‘Comprueba con un archivo HTML si los archi- ‘vos almacenados en dicha carpeta estén real- mente protegidos: jAcceso prohibido! ‘aed one pois pra aces as ec olin Este qevretibdeeacieregetie XAMPP también bloquea el acceso a la carpeta cgi- bin ¢Ha funcionado en tu caso? Fantéstico. Esta car- peta estard cerrada a “personas ajenas”, y cual- quier dato que se guarde en ella no seré accesi- ble directamente para el usuario. Sin embargo, con un script se puede (en la mayoria de los ca-14 Separar cédigo con include() sos) acceder a los datos almacenados en dicha carpeta. Shoe ME Reo) Hates (19) Y aqui es donde entra en juego la funcién inclu- de(). Gracias a esta interesante funcién es posible vincular datos externos y analizarlos include ("ruta/archivo.ext") Entre paréntesis se debe indicar la ruta de acce- so, el nombre del archivo y la extensién. Rodea toda la string con un par de comillas. Recuerda las siguientes reglas: * Mediante include() se desactiva automatica- ‘mente la notacién PHP. Por tanto, el archivo a vincular se consideraré siempre como un archivo de texto o HTML normal. * Si deseamos vincular parrafos PHP, el archi- vo en cuestién deberd incluir etiquetas de PHP: Aqui no ocurre nada més que la declaracién de la contrasefia, en forma de variable $pw. Guarda este archivo en la carpeta cgi-bin de tu servidor. Normalmente, dicha carpeta (si existe) se encuentra directamente debajo de la raiz, Para probarlo offline, también tendrés que crear una carpeta cgi-bin directamente dentro de la raiz de XAMPP (htdocs). Ruta al archivo include ¢Cuél es la ruta de acceso al archivo include? En mi ejemplo, el archivo inseguro se encuentra dentro de / php2. Por tanto, primero debo subir un nivel (..)y después entrar en la carpeta cgi- bin. La ruta de acceso completa es: /egi-bin/password. inc. php En tu proveedor online puedes utilizar rutas que partan de la carpeta raiz: /egi-bin/paseword.inc.php En mi prueba offline con XAMPP, no ha funcio- nado con este segundo método. El siguiente paso es modificar el cédigo del ar chivo “inseguro”. Vincula el archivo de la con- trasefia y sustituye la contrasefia por la variable $pw: funciona? Encontraras mi solucin en el archivo insegurod. php: Aqui empieza el area secreta
";Separar cédigo con include() 15 Vincular un archivo HTML Para terminar, todavia falta el “Atea secreta’ Bastard con vincular un archivo HTML conven- cional, pero tinicamente silo guardas en la ca- repta segura cgi-bin. (Ya que, de lo contrario, cualquiera que conozca la direcci6n directa po- dria acceder a los datos). Modifica la segunda consulta if del archivo “in- seguro” de la siguiente forma: se (Sogn) { include (* b La pagina secreto.htm! no contiene ninguna eti- queta en PHP. Basta con utilizar lineas HTML sencillas: chisTop Secret/hi>
Esta es el érea secretac/b>.
Compéralo con el archivo inseguro5:php. /egi-bin/secreto.htm1") ; Mayor seguridad con una extension falsa Puedes probar un truco més para lograr una mayor seguridad. Para ello, tendras que asignar a la pagina secreta una extension distinta de ‘html, por ejemplo gif. ‘Vincula la pagina de la siguiente forma: if ($login) { include (* } Si, por algiin motivo, un usuario puede abrir la pagina directamente, como minimo ésta no se mostrard. Al fin y al cabo, el navegador espera que se trate de un archivo de imagen y se negara a cargar el documento como archivo de texto. Sin embargo, la funcién include() hace caso omi- so de esta extensi6n “incorrect” /egi-bin/secreto.aif") ; Compara el c6digo con el archivo del suplemen- to inseguro6.php. Ejercicio sobre proteccion CoE] Esta parte s6lo contiene un ejercicio. Remodela- remos la proteccién con contrasefia de forma que se pidan tres contrasefias y se muestren tres paginas distintas, De este modo podrds asentar y practicar los conocimientos que ya tienes (del curso anterior), 1m Ejercicio: miiltiples contrasefias Las tres contrasefias del ejemplo son a?ix201, a?ix202 y a?ix203. Para el andlisis del formulario, utiliza la instruc- cién switch. Analizaremos el campo pass, y ade- més he introducido las contrasefias en los pun- tos correspondientes para hacerlo més claro. Como recordatorio, este es el aspecto de una ins- truccién switch clasica awiteh ($_P0sT['pass']) { case "a?ix201" echo “krea secretal"; break; ease "a?in202": echo "Area secreta2"; break; case "a?ix203": echo "Area secreta3"; break; - default: echo "
iIntroduce una contrase- fiat
";
}
jSin embargo, no tiene que quedarse asf!
1. Guarda las tres contrasefias en el archivo
pw.inc.php dentro de cgi-bin y guardalas en
las variables $pw1, $pw2 y $pw3.
2. Vincula este archivo correctamente en la pé-
gina de peticién de la contrasefia.
3. Guarda también los tres archivos HTML en
la carpeta cgi-bin y vincullalos de forma ex-
terna. Llamalos secretol. gif, secreto2.gif y se-
creto3 gif. (Extension gif)
Encontrards la solucién en el archivo multi-
pw.php.16 Escribir funciones propias
Escribir funciones propias
‘Ya has recorrido un buen trecho para convertirte Por lo general, una funcién suele devolver un
en un profesional de PHP. En este capitulo ve- valor, que puede ser un ntimero, una cadena 0
remos un tema muy importante, que por moti. _un valor como true o false.
vos de espacio no pude tratar en el cuaderno an- : .
terior: el de las funciones. ¢Por qué funciones propias?
Hay ocasiones en las que PHP no ofrece ninguna
funcionalidad ni hay posibilidad de que lo haga
en el futuro. En estos casos, deberemos escribir
nuestras propias funciones.
Ya hemos hablado de muchas de las funciones
integradas en PHP. Sabemos comprobar la fecha
y la hora con date(), dar formato a cadenas de
texto con sprinif) 0 comprobar la versién de
Las funciones propias presentan una ventaj
mientras que las funciones predefinidas son una
especie de “black box” (slo vemos el resultado
y no sabemos cémo PHP llega hasta él), en el ca-
eres 50 de las funciones propias somos nosotros
La funci6n isset($Variable) comprueba si existe quienes definimos con total precisién lo que
tuna variable y devuelve true o false en funci6n ——_curre con los argumentos y qué valor se de~
del resultado. vuelve.
El objeto que se comprueba se suele denominar _Puedes guardar tus propias funciones a buen re-
también argumento. caudo y utilizarlas tinicamente cuando las nece-
sites.
Sintaxis de las funciones
Pero antes de crear nuestra primera funci6n,
veamos la sintaxis basica:
function Nombrefuncion(argumento[, Argumento] )
{
Lineacodigo(n) ;
return $Valorvariable;
)
Llaves Nombres de las funciones
Como se puede observar el bloque dela funcién Lp mismo que ocurre con los nombres de las va-
estd contenido entre un par de Haves. riables es aplicable a las funciones: deberemos.
evitar los espacios en blanco, los caracteres espe-
ciales y diéresis, y no deben empezar por un
ntimero. Se distingue entre maytisculas y mi-
nusculas.
Se suele utilizar mucho el c6digo tipo “camello”.
En el caso de funciones cuyo nombre contenga
varias palabras, se escribe la segunda (y tercera)
palabra en maytiscula, a fin de mejorar la legibi-
Tidad.
Por ejemplo, escribe mittuevaFuncion().
En este caso, ademés, se trabaja con una sangria
del texto de cuatro caracteres.Escribir funciones propias 7
Un ejemplo: de bruto a net
Hace muchos afios, hice un ridiculo espantoso
en un curso de informatica. Como profesor, na-
turalmente. Se trataba de calcular el valor neto
partiendo del valor bruto, y en lugar de ello, yo
traté el valor bruto como si fuera el neto.
Sin embargo, desde entonces ya no he cometido
‘més fallos en este tema. Es la oportunidad per-
fecta para escribir una funcién que se encargue
de esta imporante conversi6n.
La funci6n partiré del valor bruto y calculard el
valor neto, redondedndolo dos decimales. (De
ello se encargars Ja funci6n sprintf), de la que
ya hablamos largo y tendido en el cuaderno an-
terior sobre PHP). Para terminar, la funcién de-
vuelve el valor modificado (convertido).
function brutoaNeto ($2w)
{
Sew = $2w / 1.16;
$2 = sprint ("01.26", Saw);
return $2w;
En el script, puedes guardar el resultado de la
funcién en wna variable, o mostrarlo directamen-
te con echo. Y eso mismo es precisamente lo que
he hecho yo en el archivo del suplemento bruto-
neto.php:
"; } else { echo "
No se ha podido cargar e1 archivo.
" } } else { echo "
El archivo tiene més de $tamanyomax bytes y es demasiado grande.
";
}
} else {
echo "
\n"; 3 } a} 45 closedir($filehandle); // Fin lectura archivos 46 72> Formulario de carga Las Iineas 3-7 no suponen ningtin enigma. En elas creamos el formulario para cargar el archi- vo. Lo importante es el par atributo-valor adi- cional enctype=" multipart/form-data” de la etique- ta