|
|
|
Encapçalaments o headers |
|
|
|
En aquesta pràctica tractarem:
- Les sentències de control explicades a la pràctica
anterior.
- Com podem identificar i controlar l'entrada d'usuaris
a un directori.
- Alguns valors de l'array $_SERVER.
- Ús de la funció getenv().
- Reencaminament d'adreces mitjançant header.
Ho posarem en funcionament amb la creació d'un petit sitema de
validació per contrasenya i amb d'altres exemples. |
|
|
|
|
|
Identificació amb contrasenya |
|
|
|
Aprofitant
les sentències comentades, crearem un petit exemple d'identificació
mitjançant un formulari senzill en què hi entrarem el nostre
nom d'usuari i la nostra contrasenya. Segons les dades entrades, s'autoritzarà
o no l'entrada.
També utilitzarem algunes del les variables predefinides
que ens ofereix el PHP. En concret, recollirem algunes informacions passades
per la variable $_SERVER. Es tracta d'un array
associatiu que conté informació de les capçaleres
tant de petició com de resposta. Recordeu que podeu trobar la informació
que contenen aquestes variables executant la funció phpinfo()
(podeu anar a l'adreça http://localhost/home/phpinfo.php),
especialment a l'apartat "PHP variables". |
|
|
|
La pràctica següent, que consisteix en un sistema
de restricció d'accés mitjançant les variables $PHP_AUTH_USER
i $PHP_AUTH_PW, només funcionarà si PHP ha estat instal·lat
com a mòdul de l'Apache (instal·lació més habitual).
Així és com s'instal·la amb l'EasyPHP 1.7 i, per tant,
no hi hauria d'haver cap problema perquè funcionés en el vostre
sistema però sí que els podeu tenir en d'altres servidors. |
|
|
|
Copieu el codi següent al vostre editor i deseu-lo
amb el nom m2p51.php. Després,
executeu-lo per veure'n el funcionament.
Podeu veure en el codi mateix que l'usuari per entrar és professorat
i la contrasenya és entrada. |
|
|
|
<?php
/*-----------------------------------------------------------------
* Mòdul: 2 Pràctica: 5 Fitxer: m2p51.php
* Autor: D116 Data:
* Descripció: Control d'accés
* Pre condi.: PHP instal·lat com a mòdul d'Apache
* Post cond.:
-----------------------------------------------------------------*/
// Fem una doble comprovació: primerament si s'ha definit la variable
// corresponent a l'usuari ($_SERVER['PHP_AUTH_USER']); si s'ha definit,
// comprovem en segon lloc que l'usuari i la contrasenya
// siguin correctes
// Comprovem que l'usuari s'hagi entrat
if (!isset($_SERVER['PHP_AUTH_USER'])) {
// Si no s'ha entrat,
header('WWW-Authenticate: Basic realm="Intracentre"');
header('HTTP/1.0 401 Unauthorized');
echo '<CENTER><H2>Accés restringit...</H2>';
echo '<HR>Cal tenir autorització per accedir a aquests recursos.<BR>';
echo '</CENTER>';
exit;
// Si s'ha entrat, comprovem que sigui correcte
} elseif (($_SERVER['PHP_AUTH_USER']!= 'professorat') || ($_SERVER['PHP_AUTH_PW']
!= 'entrada')) {
header('WWW-Authenticate: Basic realm="Intracentre"');
header('HTTP/1.0 401 Unauthorized');
echo '<CENTER><H2>Accés restringit...</H2>';
echo '<HR>Cal tenir autorització per accedir a aquests recursos.<BR>';
echo '</CENTER>';
exit;
} else {
//Accés concedit
echo '<CENTER><H2>Recursos compartits</H2></CENTER>';
?>
<br><br>
<ul>
<li>Plantilles informes</li>
<li>Documents de coordinació </li>
<li>Normes d'avaluació</li>
</ul>
<?
// mostrem la informació continguda
echo "<hr>";
// mostrem la IP que recuperem de l'array $_SERVER[]
echo "Accés des de l'adreça IP (array '\$_SERVER[]')
(\$_SERVER['REMOTE_ADDR']): <B>".$_SERVER['REMOTE_ADDR']."</B>";
// mostrem novament la IP utilitzant un altre mètode, amb la funció
gentenv()
echo "<BR>Accés des de l'adreça IP (funció
'getenv') (getenv('REMOTE_ADDR')): <B>".getenv('REMOTE_ADDR')."</B>";
echo "<BR>Script que s'està executant (\$_SERVER['PHP_SELF']):
<B>".$_SERVER['PHP_SELF']."</B>";
echo "<BR>Usuari entrat (\$_SERVER['PHP_AUTH_USER']): <B>".$_SERVER['PHP_AUTH_USER']."</B>";
echo "<BR>Contrasenya entrada (\$_SERVER['PHP_AUTH_PW']): <B>".$_SERVER['PHP_AUTH_PW']."</B>";
exit;
}
?> |
|
Llistat 2.5.1. Identificació
amb contrasenya. |
|
|
|
El procés que s'ha de seguir, que d'altra banda
es veu ja en els comentaris del codi, és el següent:
- Primer de tot, mitjançant $_SERVER["PHP_AUTH_USER"]
mirem si s'ha entrat usuari; si no hi ha usuari, es mostra la pàgina
d'accés restringit.
|
|
- En cas que sí que
hi hagi l'usuari definit, comprovarem (elseif)
que el nom 'usuari' i la contrasenya siguin correctes; en cas afirmatiu,
entrem a la pàgina de continguts, sinó es mostra la pàgina
d'accés restringit.
|
|
- Si s'autoritza l'accés,
al capdavall de la pàgina es mostra un seguit d'informacions.
Per fer-ho utilitzem, com hem dit, l'array $_SERVER[]. Podeu veure també
en el codi que una alternativa per obtenir aquesta mateixa informació
és utilitzar la funció getenv()
que recupera els valors de les variables d'entorn com per exemple les
que s'utilitzen en aquest codi.
|
|
|
|
|
|
Redirecció amb header |
|
|
|
Un dels elements útils del PHP és l'ús
dels headers o capçaleres HTTP de fitxer. Ja hem vist a
l'exemple anterior un cas pràctic d'ús de la funció
header().
En aquest cas, es tractava d'un encapçalament de resposta davant
la petició que li fem.
Aquesta funció pot admetre diferents tipus d'encapçalament.
Com a exemple, en veurem dos dels més habituals: Location
i Content-Type. |
|
|
|
Location |
|
Enviant la capçalera Location
al navegador, podrem reencaminar les peticions enviades al nostre servidor.
Si copiem l'exemple següent a l'editor, el desem (amb el nom de redirec.php,
per ex.) i l'executem farà que el nostre navegador mostri automàticament
la pàgina de la XTEC. |
|
|
|
<?php
header("Location: http://www.xtec.net");
?> |
|
Llistat 2.5.2. Redirecció amb header. |
|
|
|
|
|
Content-Type |
|
Amb aquest encapçalament advertim de quin tipus
és el fitxer que enviarem. A l'exemple que segueix, podeu veure
com des del PHP generem un fitxer de l'Excel, amb valors numèrics
i les fórmules corresponents. Podríem, també, generar
un fitxer Word, PDF, etc.
Copieu el codi a l'editor, deseu-lo amb el nom de m2p53.php,
executeu-lo i observeu com es genera un nou fitxer de l'Excel amb les
dades que li passem. |
|
|
|
<?php
/*-----------------------------------------------------------------
* Mòdul: 2 Pràctica: 5 Fitxer: m2p53.php
* Autor: D116 Data:
* Descripció: Generació d'un full de càlcul Excel
(headers)
* Pre condi.:
* Post cond.:
-----------------------------------------------------------------*/
// Atenció! No es pot posar cap altra codi o espai anterior al
header
header("Content-type: application/vnd.ms-excel");
echo "Notes Finals" .chr(10);
echo "Nom" . chr(9). "L. Catalana". chr(9)."L.
Castellana".chr(9). "L. Anglesa" . chr(9). "Mitjana
Alum.". chr(10);
echo "Anselm ". chr(9). "5". chr(9). "8".
chr(9). "2". chr(9). "=(B3+C3+D3)/3" .chr(10);
echo "Roser ". chr(9). "3". chr(9). "9".
chr(9). "9". chr(9). "=(B4+C4+D4)/3" .chr(10);
echo "Glòria ". chr(9). "9". chr(9). "2".
chr(9). "5". chr(9). "=(B5+C5+D5)/3" .chr(10);
echo "Miquel ". chr(9). "4". chr(9). "8".
chr(9). "7". chr(9). "=(B6+C6+D6)/3" .chr(10);
echo chr(10);
echo "Mitj. matèries" .chr(9). "=SUMA(B3:B6)/4"
.chr(9). "=SUMA(C3:C6)/4" .chr(9). "=SUMA(D3:D6)/4"
.chr(10);
?> |
|
Llistat 2.5.3. Encapçalament per a document de
l'Excel. |
|
|
|
Observeu que per fer els salts de casella i de línia,
utilitzem els codi CHR(9) i CHR(10)
respectivament. |
|
|
|
Recordeu que abans de header
no hi ha d'anar cap altra comanda ni de php ni de html. Tampoc hi hem de
deixar espais en blanc. |
|
|
|
Aquesta pràctica només funcionarà
si tenim l'Excel instal·lat a l'ordinador client. |
|
|
|
|
 |
|
|
|