Los sockets se abren con fsockopen(). Esta función está disponible tanto en PHP3 como en PHP4. Usa el siguiente formato:
int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout]]])
En el caso de un dominio de Internet, abrirá un socket TCP conectándose al hostname en el puerto port. hostname puede ser en este caso o bien un nombre de dominio real o bien una dirección IP. Para conexiones UDP , se necesita indicar explícitamente el protocolo: udp://hostname. En sistemas Unix, hostname se usará como ruta del socket y el puerto se pondrá a 0. El timeout opcional se puede emplear para definir un timeout en segundos para la llamada del sistema.
Más información sobre fsockopen() en: http://www.php.net/manual/es/function.fsockopen.php
Para acceder a un servidor de News Usenet, se requiere usar un protocolo especfico, el NNTP, Network News Transfer Protocol.
Este protocolo está muy bien definido en el RFC977 (Request For Comment numero 977), que se encuentra en http://www.w3.org/Protocols/rfc977/rfc977.html
Este documento describe con precisión como conectarse y hablar con un servidor NNTP, usando los diferentes comandos disponibles para tal efecto.
Para conectar con un servidor NNTP necesitamos saber su hostname o dirección IP, y el puerto en el que el servidor está corriendo. Deberiamos incluir el timeout, de forma que una llamada erronea, no nos cuelgue la aplicación.
<?php
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;
// open a socket
if(!$cfgTimeOut)
// without timeout
$usenet_handle = fsockopen($cfgServer, $cfgPort);
else
// with timeout
$usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);
if(!$usenet_handle) {
echo "Connexion failed\n";
exit();
}
else {
echo "Connected\n";
$tmp = fgets($usenet_handle, 1024);
}
?>
Ya estamos conectados al servidor, y podemos hablar con él a través del socket abierto. Supongamos que queremos bajar 10 artículos de algún grupo de noticias (news). RFC977 indica que lo primero que hay que hacer es selecionar el grupo de noticias con el comando GROUP:
GROUP ggg
El parámetro ggg es el nombre del grupo de noticias que seleccionamos (por ejemplo: es.comp.os.linux.programacion). Un listado de los grupos de noticias disponibles, se puede conseguir con el comando LIST. La respuesta del servidor nos indicará el número del primer y último artículo del grupo, y una estimación de los artículos disponibles.
Ejemplo:
chrome:~$ telnet my.news.host 119 Trying aa.bb.cc.dd... Connected to my.news.host. Escape character is '^]'. 200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok). GROUP es.comp.os.linux.programacion 211 232 222996 223235 es.comp.os.linux.programacion quit 205 .Tras recibir el comando "GROUP es.comp.os.linux.programacion", el servidor de News contesta "211 232 222996 223235 es.comp.os.linux.programacion". 211 es un código definido en el RFC (dice básicamente que el comando se ha ejecutado sin problemas - en el RFC hay más detalles). También ha contestado que hay 232 artículos, indexados desde el 222996 hasta el 223235. Estos números se hacen llamar número de artículo. Cada artículo tiene uno único. Si contamos: 222996 + 232 no da 232235. Los siete que faltan se borrarían del servidor de alguna forma. Es posible que se hayan cancelado por el propio autor (sí, esto se puede hacer!) o bien se han borrado tras una denuncia de abuso, por ejemplo.
Hay que prestar atención al hecho de que el servidor puede requerir autenticación antes de seleccionar el grupo de news, dependiendo de si es público o privado. Incluso puede dejar libre acceso a la lectura de artículos, pero necesitar autorización para publicar nuevos artículos.
<?php
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup = "alt.php";
// identification required on private server
if($cfgUser) {
fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."\n");
$tmp = fgets($usenet_handle, 1024);
fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."\n");
$tmp = fgets($usenet_handle, 1024);
// check error
if($tmp != "281 Ok\r\n") {
echo "502 Authentication error\n";
exit();
}
}
// select newsgroup
fputs($usenet_handle, "GROUP ".$cfgNewsGroup."\n");
$tmp = fgets($usenet_handle, 1024);
if($tmp == "480 Authentication required for command\r\n") {
echo "$tmp\n";
exit();
}
$info = split(" ", $tmp);
$first = $info[2];
$last = $info[3];
print "First : $first\n";
print "Last : $last\n";
?>
Ahora que sabemos cuál es el número del último artículo disponible, es fácil bajarse los 10 últimos artículos. RFC977 dice que el comando ARTICLE puede ser usado con el número de artículo, o bien, con el ID del Mensaje.
No es lo mismo una cosa que otra. El primero es un índice que utiliza el servidor de news al que nos conectamos, y el segundo es un índice universal que representa al artículo en todos los servidores NNTP. El ID del mensaje es un número que encontramos en la cabecera del mensaje.
<?php
$cfgLimit = 10;
// upload last articles
$boucle=$last-$cfgLimit;
while ($boucle <= $last) {
set_time_limit(0);
fputs($usenet_handle, "ARTICLE $boucle\n");
$article="";
$tmp = fgets($usenet_handle, 4096);
if(substr($tmp,0,3) != "220") {
echo "+----------------------+\n";
echo "Error on article $boucle\n";
echo "+----------------------+\n";
}
else {
while($tmp!=".\r\n") {
$tmp = fgets($usenet_handle, 4096);
$article = $article.$tmp;
}
echo "+----------------------+\n";
echo "Article $boucle\n";
echo "+----------------------+\n";
echo "$article\n";
}
$boucle++;
}
?>
Así, habremos bajado los 10 últimos artículos de este grupo de noticias en este servidor. Es posible descargar sólo la cabecera de los artículos, usando el comando HEAD, o sólo el contenido, usando el comando BODY.
Para finalizar la sesión con el servidor NNTP, simplemente cerramos el socket usando fclose(), igual que si cerraramos un fichero.
<?php
// close connexion
fclose($usenet_handle);
?>
Como todos sabemos hay muchas personas que explotan su potencial tratando de perjudicar a otros haciendo ataques a tu servidor, para tratar de evitar que esto suceda aquí te muestro algunas funciones que te pueden ayudar.
Esta funcion filtra las cadenas para que al hacer una consulta no tengas vulnerabilidad.
<?php
//funcion de filtrado
function sql_quote($value){
if(get_magic_quotes_gpc())
$value=stripslashes($value);
//berifica si la funcion existe
if(function_exists("mysql_real_escape_string"))
$value=mysql_real_escape_string($value);
else
$value=addslashes($value);
return $value;
}
?>
Esta limpia una cadena convirtiendo las etiquetas html en caracteres especiales para el navegador como á y quita las comillas simples.
<?php
function Limpiar($cadena)
{
$cadena = htmlspecialchars(stripslashes($cadena));
$cadena = str_replace("'", "", $cadena);
return $cadena;
}
?>
Esto remueve las etiquetas HTML, secciones javacript y espacios
en blanco. También convierte algunas entidades HTML comunes a sus equivalentes en texto.
<?php
function LimpiarHTML($codigo)
{
$busqueda = array ('@<script[^>]*?>.*?</script>@si',
'@<[\/\!]*?[^<>]*?>@si',
'@&(quot|#34);@i',
'@&(amp|#38);@i',
'@&(lt|#60);@i',
'@&(gt|#62);@i',
'@&(nbsp|#160);@i',
'@&(iexcl|#161);@i',
'@&(cent|#162);@i',
'@&(pound|#163);@i',
'@&(copy|#169);@i',
'@&#(\d+);@e');
$reemplazar = array ('','', '', '', '', '', '');
$texto = preg_replace($busqueda, $reemplazar, $codigo);
return $texto;
}
?>
Si en tu web mandas llamar fragmentos de código generados en archivos apartes esta te protege la para que no pongan la dirección de algún script malicioso.
<?php
function Parsear($go)
{
$go = htmlspecialchars ( trim ( $go ) );
$go = eregi_replace ( "<[^>]*>", "", $go) ;
$go = eregi_replace( "//", "", $go) ;
return $go;
}
?>
Hola ahora vamos a hacer un script que permita exportar el resultado de una consulta a un archivo, en este caso será un archivo de Excel, para empezar tenemos que tener una o mas tabla de donde obtendremos los datos que exportaremos al archivo. En el ejemplo utilizamos la siguiente tabla:
CREATE TABLE `calificaciones` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`alumno` VARCHAR( 40 ) NOT NULL ,
`parcial1` VARCHAR( 5 ) NOT NULL ,
`parcial2` VARCHAR( 5 ) NOT NULL ,
`parcial3` VARCHAR( 5 ) NOT NULL
) ENGINE = MYISAM ;
A continuación realizaremos el script que hace el trabajo, primero nos conectamos al servidor mysql, seleccionamos la base de datos, hacemos la consulta para obtener los datos, después en una variable almacenamos el contenido del archivo dándole el formato con saltos de línea para brincar a una fila nueva y tabulación para pasar a la celda siguiente.
Y por ultimo hacemos uso de las funcione para manipular archivos. Abrimos el archivo en modo escritura si ya existe lo sobrescribe, después escribimos la cabecera y el contenido.
La variable nombre contiene el nombre del archivo y url la ruta en donde se almacenara el archivo.
<?
//conectamos al servidor server/user/pass
mysql_connect("localhost","root","");
//seleccionamos la bd
mysql_select_db("prueba");
//seleccionamos lo que queremos exportar
$res = mysql_query("SELECT * FROM calificaciones");
while($data = mysql_fetch_assoc($res)){
//le damos forma al contenido
//para acomodarlo en el archivo
$contenido .= $data['id'];
$contenido .= "\t".$data['alumno'];
$contenido .= "\t".$data['parcial1'];
$contenido .= "\t".$data['parcila2'];
$contenido .= "\t".$data['parcial3'];
$promedio = $data['parcial1'] + $data['parcial2'] + $data['parcial3'];
$promedio /=3;
$contenido .= "\t".$promedio."\n";
}
//cabesera del archivo
$cabezera="ID\tNOMBRE\tPARCIAL1\tPARCIAL2\tPARCIAL3\tPROMEDIO\n";
//ruta y nombre donde se guardara el archivo
$nombre = "resplado.xls";
$url="".$nombre;
//abrimos el archivo en escritura
$p=fopen("$url","w");
if($p){
//escribimos el contenido
fputs($p,$cabezera);
fputs($p,$contenido);
}
//cerramos el archivo
fclose($p);
echo("Se exporto con exito la consuta.<br> Si desea visualizar el archivo pulsa <a href='".$url."'>aqui</a>.");
?>
En este tutorial veremos como subir cualquier archivo a una base de datos MySql y también veremos como descargar los archivos que estén el la base de datos.
Lo primero que hay que hacer es crear nuestra tabla en la base de datos, puede tener la estructura que esta abajo o cualquier otra pero si es importante que en el campo que vas a almacenar los archivos sea de tipo LONGBLOB, además de algún campo que identifique el nombre del archivo.
CREATE TABLE `archivos` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(30) collate latin1_general_ci NOT NULL,
`archivo` longblob NOT NULL,
`tipo` varchar(20) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = MYISAM ;
Posteriormente creamos el formulario don de cargaremos el archivo, cuando carguemos un archivo ala base de datos en la parte inferior se ira mostrando una lista de los archivos que están en la tabla y al dar click al enlace se descargara el archivo todo el código de la pagina esta comentado para que le entiendas mas rápido.
<?
if($_GET['descarga']){
//conectamos al servidor
mysql_connect("localhost","root","");
mysql_select_db("prueba");
$sql = "select * from archivos where id = ".$_GET['descarga'];
$res = mysql_query($sql);
$data = mysql_fetch_assoc($res);
header("Content-type: ".$data['tipo']);
header("Content-Disposition: attachment; filename=".$data['nombre']);
echo $data['archivo'];
}
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Subir archivo</title>
</head>
<body>
<h1>Subir Archivo</h1>
<?php
if(isset($_POST['guardar'])){
//conectamos al servidor
mysql_connect("localhost","root","");
mysql_select_db("prueba");
//abrimos el archivo temporal que se crea
$fh = fopen($_FILES['archivo']['tmp_name'],'r');
if($fh){ //si se abre bien leemos el archivo
$archivo = fread($fh, filesize($_FILES['archivo']['tmp_name']));
fclose($fh);
//limpiamos el contenido
$archivo = addslashes($archivo);
$tipo = $_FILES['archivo']['type'];
//nombre del archivo
if(empty($_POST['nombre']))
$nombre = sql_quote($_FILES['archivo']['name']);
else
$nombre = $_POST['nombre'];
//insertar el archivo a la bd
$sql="insert into archivos (nombre, archivo, tipo) values ('$nombre', '$archivo', '$tipo')";
mysql_query($sql);
echo "El archivo se cargo con exito<br />";
} else
echo "Error al cargar el archivo<br />";
}
?>
<form action="subirarchivo.php" method="post" enctype="multipart/form-data" name="form1">
<p>Nombre.:
<input type="text" name="nombre" />
</p>
<p>Archivo.:
<input type="file" name="archivo" />
</p>
<p>
<input type="submit" name="guardar" value="Guardar" />
</p>
</form>
<h1>Descargar archivos</h1>
<?php
//conectamos al servidor
mysql_connect("localhost","root","");
mysql_select_db("prueba");
//seleccionamos los archivos que hay en la db
$sql = "SELECT * FROM archivos";
$res = mysql_query($sql);
$lista = '<ol>'; //generamos la lista
while($data = mysql_fetch_assoc($res)){
$lista .= '<li>
<a href="subirarchivo.php?descarga='.$data['id'].'">
'.$data['nombre'].'
</a>
</li>';
}
$lista .= '</ol>';
echo $lista;
?>
</body>
</html>
Hola a todos en este tutorial vamos a explicar como hacer un calendario en php y lo vamos a cargar en una página utilizando ajax, también los enlaces que nos permiten desplazarnos en los meses y los años están en ajax para que la pagine no tenga que cargarse de nuevo, además tiene un enlace que despliega un formulario el cual nos permite seleccionar el mes y el año al cual nos queremos mover, el rango de los años son 10 mas y 10 menos.
Lo primero que hay que hacer es crear la página principal, en la que cargaremos el calendario, en esta pagina tenemos que incluir las funciones para crear el objeto ajax, las funciones del navegador y formulario de desplazamiento, la hoja de estilo y el archivo php.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>calendario</title>
<style media="all" type="text/css" title="Estilo del Calendario">
@import "calendario.css";
</style>
<script src="ajax.js" language="javascript"></script>
<script src="cargar_ajax.js" language="javascript"></script>
</head>
<body>
<h1>Calendario</h1>
<?php
include("calendario.php");
?>
</body>
</html>
El archivo calendario.php es el mas importante, ya que en el se encuentran las funciones que crean el calendario, además que en el se forma la tabla que contendrá el formulario. Todo el archivo tiene comentarios para que lo entiendas más rápido, no mostramos este archivo por que es algo extenso pero al final del tutorial puedes descargar todos los archivos funcionando.
En el archivo ajax.js se encuentra la función que crea el objeto ajax:
function xmlhttp() { //crear el objeto de ajax
var xmlhttp;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false;}}}
if (!xmlhttp) return null;
else return xmlhttp;
}
Y en el archivo cargar_ajax.js se encuentran las funciones otraFecha(opc) y Navegador(ano,mes), las cuales son las que permiten el desplazamiento en el calendario sin que se cargue la pagina. La función otraFecha carga el contenido del archivo cargarCalendario.php el cual contiene el formulario de ir a otra fecha, y la función Navegador carga el contenido del archivo calendario.php pero le envía el año y mes al cual se quiere mover, es algo enredoso si eres primerizo pero con un poco de análisis le entenderás.
function otraFecha(opc){ //funcin para cargar el formulario de ir a otra fecha
var ajax=xmlhttp();
ajax.onreadystatechange=function(){
if(ajax.readyState == 4){
links = "<a onclick=\"document.getElementById('otrafecha').innerHTML = ''\">Quitar ⇑</a>";
document.getElementById('otrafecha').innerHTML = ajax.responseText+links;
}
else
document.getElementById('otrafecha').innerHTML = '<img src="img/loading.gif" />Cargando...';
}
ajax.open("GET","cargarCalendario.php?opc="+opc,true);
ajax.send(null);
return false;
}
function Navegador(ano,mes){ //funcion para los link (navegar) del calendario
var ajax=xmlhttp();
ajax.onreadystatechange=function(){
if(ajax.readyState == 4)
document.getElementById('calendario').innerHTML = ajax.responseText;
else
document.getElementById('calendario').innerHTML = '<img src="img/loading.gif" />Cargando...';
}
ajax.open("GET","calendario.php?a="+ano+"&mes="+mes,true);
ajax.send(null);
return false;
}
Y el archivo cargarCalendario.php
<? if($_GET['opc']==0){ //carga el formualario de otrafecha ?>
<label for="mes">Mes: <select name="mes">
<?php
$nombremes = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
for($c=1;$c<=12;$c++)
echo '
<option value="'.$c.'">'.$nombremes[$c-1].'</option>';
?>
</select></label>
<br /><label for="a">Año: <select name="a">
<?php
for($c=date("Y")-10;$c<=date("Y")+10;$c++)
echo '
<option value="'.$c.'">'.$c.'</option>';
?>
</select></label>
<br /><input type="button" onclick="Navegador(calendario.a.value,calendario.mes.value);" name="ir" value="Ir a la fecha"/>
<? } ?>
Descarga los archivos completas incluyendo el archivo calendario.css.
<?php
function conectarse()
{
if (!($link=mysql_connect("localhost","root","pswd")))
{
echo "Error conectarse a la BD";
exit();
}
if(!mysql_select_db("tu base de datos",$link))
{
echo "Error selecionando la bd";
exit();
}
return $link;
}
$link=conectarse();
mysql_close($link);
?>
</body>
</html>
Veremos como crear un buscador con PHP y MySQL que servirá para cualquier tabla MySQL de nuestra base de datos y que podrá ser mostrado facilmente en nuestro sitio web.
El script consta de tres partes. La configuración, el formulario y el proceso del formulario. La primera parte, la más sencilla de todas, es donde tendrás que poner los datos de tu base de datos y la tabla donde quieres que el buscador realice las búsquedas. No tiene pérdida. Al final de la configuración realizamos la conexión a la base de datos ya que la usaremos cada vez que se acceda al buscador.
En la segunda parte se trata la creación del formulario. Como no conocemos los campos de la tabla tenemos que generar ese camop del formulario dinámicamente. Para ello utilizamos la sentencia "SHOW FIELDS from table" que nos devuelve información de todos los campos que hay en la tabla. De esta forma conseguimos que nos liste todos los campos de la tabla que hayamos escogido al configurar, en el formulario.
En la tercera parte, que solo se ejecuta si se ha enviado el formulario, se realiza la búsqueda con los datos obtenidos. Para ello utilizamos una sentencia de SQL de este tipo: "select * from tabla where campo LIKE %valor%" la cual nos devuelve todas las filas donde haya encontrado algo que contenga el valor en el campo seleccionado. Finalmente mostramos los resultados obtenidos utilizando un bucle para recorrer todos los campos de la tabla.
Configurar y subir, así de facil :) Archivo:
buscador_generico.php
<?
// Buscador para tablas MySQL escrito en PHP. Por Alex para www.webtaller.com
// Creado el 13-10-2003
////////////////////////////
// Configuración
///////////////////////////
//modifica estas variables según tu servidor de MySQL
$bd_servidor = "localhost";
$bd_usuario = "pepito";
$bd_contrasenya = "grillo";
$bd_bdname = "mybd";
$bd_tabla = "unatabla"; // Tabla donde se harán las búsquedas
// Conexión y selección de la base de datos
$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);
mysql_select_db($bd_bdname,$link);
////////////////////////////
// Formulario
///////////////////////////
?>
<center>
<p><h2>Introduce las palabras para la búsqueda</h2></p>
<p><form name="buscador" method="post" action="buscador_generico.php"><br>
Buscar en:
<select name="campo">
<?php
//Con este query obtendremos los campos por los cuales el usuario puede buscar
$result = mysql_query("SHOW FIELDS from `$bd_tabla`",$link);
while($row = mysql_fetch_row($result)) {
// en $row[0] tenemos el nombre del campo
// de esta manera no necesitamos conocer el nombre de los campos
// por lo que cualquier tabla nos valdrá
?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></option>
<?php
}
?>
</select>
Palabra(s): <input type="text" name="palabra"><br>
<input type="submit" value="Enviar" name="enviar">
</form></p>
</center>
<?
////////////////////////////
// Proceso del Formulario
///////////////////////////
if(isset($_POST[enviar])) {
// Solo se ejecuta si se ha enviado el formulario
$query = "select * from $bd_tabla where `{$_POST[campo]}`
LIKE %{$_POST[palabra]}%";
$result = mysql_query($query,$link);
$found = false; // Si el query ha devuelto algo pondrá a true esta variable
while ($row = mysql_fetch_array($result)) {
$found = true;
echo "<p>";
foreach($row as $nombre_campo => $valor_campo) {
// Tenemos que mostrar todos los campos de las filas donde se haya
// encontrado la búsqueda.
if(is_int($nombre_campo)) {
continue; //Cuando hacemos mysql_fetch_array, php genera un array
// con todos los valores guardados dos veces, uno con
// índice numérico y otro con índice el nombre del campo.
// Solo nos interesa el del nombre del campo.
}
echo "<b>".$nombre_campo."</b> : ".$valor_campo."<br>";
}
echo "</p>";
}
if(!$found) {
echo "No se encontró la palabra introducida";
}
}
?>Si tenemos en nuestra página un buscador será muy util para el usuario que cuando vaya a alguno de los resultados encontrados por nuestro buscador, le salgan las palabras clave marcadas. Para hacer esto utilizaremos la función str_replace() (evitar siempre eregi_replace en la medida de lo posible ya que esta función consume muchos más recursos). Resaltar una palabra es tan sencillo como sustituir en el texto la palabra por <strong>palabra</strong> para marcarla en negria o <span style="background-color: #88AAEEF">palabra</span> para marcarla con fondo azul.
<?php
$busqueda = "prueba";
$link = mysql_connect("host","user","pass");
mysql_select_db("db",$link);
$result = mysql_query("select contenidos from tabla
where keyword LIKE %$busqueda%",$link);
while($row = mysql_fetch_row($result)) {
echo str_replace($busqueda,"<span style=background-color: #88AAEE>
$busqueda</span>",$row[0]);
echo "<br><br>";
}
?>Leemos el contenido de una supuesta tabla MySQL y al mostrarlo en pantalla, reemplazamos la palabra de búsqueda con el estilo de fondo azul.
Lo primero seria, crear un archivo de texto (passwords.txt) y ponerle permiso 777CHMOD, y colocar en cada linea los usuarios que tienen permiso para dicha página o contenido, en el sisguiente formato: nombre_de_usuario|contraseña
Veamos un ejemplo - passwords.txt
Joe|1235
Pedro|qwer
Noe|Gty45e
kermit|rwe4v
En este ejemplo se pide la autorización al comienzo de la página si no se ha establecido con anterioridad y se comprueba con el fichero de contraseñas que hemos llamado passwords.txt, si el nombre de usuario y contraseña coincide con alguna entrada del fichero se nos permite ver el resto de la página.
<?php
if (!isset($PHP_AUTH_USER)) {
header(WWW-Authenticate: Basic realm="Acceso restringido");
header(HTTP/1.0 401 Unauthorized);
echo Authorization Required.;
exit;
}
$fich = file("passwords.txt");
$i=0;
$validado=false;
while ($fich[$i] && !$validado) {
$campo = explode("|",$fich[$i]);
if(($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1])))
$validado=true;
$i++;
}
if (!$validado) {
header(WWW-Authenticate: Basic realm="Acceso restringido");
header(HTTP/1.0 401 Unauthorized);
echo Authorization Required.;
exit;
}
?>
<html>
<head>
<title>Pagina protegida</title>
</head>
<body>
Ha conseguido el acceso a la <b>zona restringida</b> con el
usuario <?php echo $PHP_AUTH_USER?>.
</body>
</html>Importante: Como podemos ver al ejecutar la página emerge una Cuadro de dialogo, que solicita los datos de acceso para mostrar el contenido del documento web, bien podemos modificarlo un poco y crear nosostros mismos un formulario de html, para que los usuarios ingresen mediante esta via, a la página protegida.
Muchas veces, desde otra página web, enlazan directamente a un archivo de nuestro servidor, esto sobrecarga nuesto ancho de banda sin reportarnos ningún beneficio, para evitarlo podemos tomar algunas medidas a la hora de enviar el archivo. Comprovar el referente
Podemos restringir a que solo se pueda descargar el archivo cuando se proviene de una determinada página, esto sería efectivo si no hubiera usuarios que navegan detrás de proxys que eliminan el referente, en este caso ninguno de estos usuarios podría descargar el archivo ni que proviniera de la página correcta.
Usar una cookieEn mi opinión este método es mas eficaz, guardaremos una cookie en la página donde situamos el enlace hacia nuestra descarga, de esta manera luego podremos comprobar que préviamente se ha pasado por esa página, es decir, que la descarga está autorizada:
<?php // Esto tiene que estar al principio del // todo del documento antes de enviar nada // al navegador (ni siquiera un espacio) // de lo contrario tendremos un error setcookie (descarga , 1 ); ?>
Luego situaremos el archivo a descargar en una carpeta secreta a la que daremos un nombre aleatório para que no sea fácil de encontrar, por ejemplo 23hi938fdfgh39, y crearemos el siguiente archivo:
descargar.php<?php
// Indicamos el nombre del directório
define ( dir , 23hi938fdfgh39 );
// Comprovamos que exista la cookie
if($_COOKIE [ descarga ] == 1 ){
// Si existe la cookie intentamos
// leer el archivo
$archivo = $_GET [ archivo ];
if( file_exists ( dir . / . $archivo )){
// Si existe el archivo lo enviamos
header ( Content-Type: application/octet-stream );
header ( Content-Disposition: attachment; filename= . $archivo );
echo file_get_contents ( dir . / . $archivo );
} else {
// Sino existe el archivo enviamos
// un error 404
header ( HTTP/1.0 404 Not Found );
echo <h1>ERROR</h1><br />No se h ,
a encontrado el archivo sol ,
icitado ;
}
} else {
// Sino hay cookie enviamos un error
// 401
header ( HTTP/1.0 401 Unauthorized );
echo <h1>ERROR</h1><br />No puedes ,
acceder a este archivo desde ,
un servidor externo ;
}
?>Entonces desde la página donde hemos creado la cookie podemos llamar a descargar el archivo haciendo un enlace hácia descargar.phpóarchivo=NOMBRE.ZIP, por ejemplo:
<a href="descargar.phpóarchivo=chat.zip">Descargar</a> Y con este sencillo método habremos protegido nuestros archivos de la descarga externa mediante cookies.