Foros del Web » Programando para Internet » PHP »

Impedir el acceso directo a una pagina php

Estas en el tema de Impedir el acceso directo a una pagina php en el foro de PHP en Foros del Web. Hola Tal vez este tema ya ha sido posteado antes en este foro, pero busq mas de una hora y no encontre nada q me ...
  #1 (permalink)  
Antiguo 06/09/2005, 17:38
okram
Invitado
 
Mensajes: n/a
Puntos:
Busqueda Impedir el acceso directo a una pagina php

Hola

Tal vez este tema ya ha sido posteado antes en este foro, pero busq mas de una hora y no encontre nada q me sirva.

Tengo una pagina marcar.php que me genera una imagen marcada:
Código PHP:
<?php

$image 
$_GET['i'];
$watermark "water.png";
$im imagecreatefrompng($watermark);
$ext substr($image, -3);
if(
strtolower($ext) == "gif") {
    if (!
$im2 imagecreatefromgif($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else if(
strtolower($ext) == "jpg") {
    if (!
$im2 imagecreatefromjpeg($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else if(
strtolower($ext) == "png") {
    if (!
$im2 imagecreatefrompng($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else {
    die;
}

imagecopy($im2$im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)/2)-(imagesy($im)/2), 00imagesx($im), imagesy($im));

header("Content-Type: image/jpeg");
imagejpeg($im2);
imagedestroy($im);
imagedestroy($im2);

?>
Bueno eso es lo basico. Aqui viene mi pregunta. Necesito hacer que esta pagina sea llamada solo usando <img src="marcar.php?i=images/image001.jpg">... mas que no se pueda acceder directamente desde el navegador, osea http://misitio.com/marcar.php?i=images/image001.jpg...

Pense en un codigo como este al inicio:
Código PHP:
$_page_name "marcar.php";
$_actual_page $_SERVER['REQUEST_URI'];
if(
eregi($_page_name$_actual_page)) 
    {
    
// No ejecuto nada
    
exit;
    }
else
    {
    
// Aqui el codigo que genera la imagen
    

y me funciona bien cuando se trata de ingresar directamente por la url. osea no muestra nada si se ingresa directamente, y si lo hace cuando lo llamo con un include p.ej.

pense q iba a funcionar, pero cuando lo probe no resulto. al llamar a esta pagina con la etiqueta <img src...> me muestra la tipica × roja... a pesar q la url del navegador no indica la pagina marcar.php, no me genera nada...

Mi pregunta en resumen es...

SOLO con php, como puedo saber la url del navegador ($_SERVER['REQUEST_URI'] no me sirve), o como puedo de otra manera impedir un acceso directo a la pagina, pero que si funcione en una etiqueta <img>...???3.

Espero se me haya entendido y me puedan ayudar

Salu2
  #2 (permalink)  
Antiguo 06/09/2005, 17:49
Avatar de K3NNY
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: ARGENTINA!
Mensajes: 1.493
Antigüedad: 20 años, 1 mes
Puntos: 20
No tengo mucha idea de PHP, pero me parece que podrias hacer un script que se fije si el referer viene de tu dominio o no. Tambien podrias poner esa pagina en un directorio aparte y ponerle contraseña usando el panel de control de tu hosting. Espero que te haya servido...
__________________
delFuego.com.ar
mi tumblelog sobre diseño

La dedicación en mi respuesta es directamente proporcional a la dedicación en tu pregunta.
  #3 (permalink)  
Antiguo 06/09/2005, 18:20
okram
Invitado
 
Mensajes: n/a
Puntos:
Exclamación

Gracias K3NNY, pero...

Cita:
Iniciado por K3NNY
me parece que podrias hacer un script que se fije si el referer viene de tu dominio o no
No puedo usar referer, primero porq mi intencion no es ver si se accede a la pagina dsd mi propia web o dsd afuera, sino que mas bien no se acceda a esa pagina. Obviamente ninguna pagina linkeara mediante un <a href...> a marcar.php, solo sera llamada con la etiqueta <img...>.... por eso no puedo usar HTTP_REFERER

Cita:
Iniciado por K3NNY
Tambien podrias poner esa pagina en un directorio aparte y ponerle contraseña usando el panel de control de tu hosting. Espero que te haya servido...
si pongo la pagina en un directoirio aparte con contraseña, entonces no podre acceder a ella con la etiqueta <img> :-p .

Pero de todas maneras pense en eso del directorio aparte, y tal vez con un .htaccess controlar su acceso...pero no tengo ni idea de lo q pueda poner en ese htaccess para lograr lo q quiero....

insisto en la pregunta... por favor... necesito ayudaaa

Salu2
  #4 (permalink)  
Antiguo 07/09/2005, 17:21
okram
Invitado
 
Mensajes: n/a
Puntos:
ayuda plzzzzzzzzzzzzzzzzzzz................... es q no c puede'?????
  #5 (permalink)  
Antiguo 07/09/2005, 20:14
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 19 años, 1 mes
Puntos: 0
este codigo usaba phpnuke para impedir acceso directo al index de sus modulos
Código PHP:
 if (!eregi("marcar.php"$_SERVER['PHP_SELF'])) { 
  die (
"You can't access this file directly...");

lo que hace es buscar en la direccion de peticion si existe la cadena "marcar.php"... si lo encuentra entonces sabras que estan intentando acceder a dicha pagina y la termina con: die('mesaje')
la funcion die('mensaje') termina la ejecucion del php he imprime 'mensaje'
  #6 (permalink)  
Antiguo 07/09/2005, 23:45
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 20 años, 2 meses
Puntos: 0
Cita:
Iniciado por luistar
este codigo usaba phpnuke para impedir acceso directo al index de sus modulos
Código PHP:
 if (!eregi("marcar.php"$_SERVER['PHP_SELF'])) { 
  die (
"You can't access this file directly...");

lo que hace es buscar en la direccion de peticion si existe la cadena "marcar.php"... si lo encuentra entonces sabras que estan intentando acceder a dicha pagina y la termina con: die('mesaje')
la funcion die('mensaje') termina la ejecucion del php he imprime 'mensaje'
y con las llamadas desde [img] no hay problema?
  #7 (permalink)  
Antiguo 08/09/2005, 04:40
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 21 años, 1 mes
Puntos: 1
prueba con

if (($_SERVER['HTTP_REFERER'] == "")){
echo "acceso indebido";
}
else{
la pagina si entra bien
}

Un Saludo

con esto loq ue conseguiras es que si la llamada no es desde un link dentro de tu server no muestre la web
  #8 (permalink)  
Antiguo 08/09/2005, 06:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Yo usaría sesiones:

En alguna parte de tu sistema inicias tu variable de sesión (login?) dando un valor a esta .. o bien si no usas sistema de control de usuarios simplemente en la página que llame a tu otro script defines tu variable de sesión y en ese script aparte que llamas, validas la existencia de esa variable de sesión .. SI existe es que pasó por la página principal de tu sistema que en su proceso/procedimiento llama a tu otro script .. si no existe, intentó acceder directamente.

pagina_x.php
Código PHP:
<?
session_start
();
$_SESSION['autentificado']="Da igual el valor";
// etc de tu script . ..
?>
Tu script a proteger.php
Código PHP:
<?
session_Start
();
if (empty(
$_SESSION['autentificado'])){
// no está autentificado
exit; // salimos del script .. no corresponde accceso directo.
}
// resto de tu script tal cual lo usas actualmente ...
más info sobre sesiones:
www.php.net/session (y las FAQ's de este foro php).

Un saludo,
  #9 (permalink)  
Antiguo 08/09/2005, 18:35
okram
Invitado
 
Mensajes: n/a
Puntos:
Hola

Gracias por las sugerencias... lo intentare y ya posteare como me fue

Salu2
  #10 (permalink)  
Antiguo 11/09/2005, 15:36
 
Fecha de Ingreso: agosto-2005
Mensajes: 109
Antigüedad: 18 años, 8 meses
Puntos: 0
Tienes una forma sencilla y elegante de hacerlo...

En la página:

Código PHP:
if (!defined('DESDE_CASA')) {
    
header("Location: index.php");  //  le mandas directamente a casa 
    
exit;

y en el index.php:

Código PHP:
define('DESDE_CASA'1); 
  #11 (permalink)  
Antiguo 11/09/2005, 19:51
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Shockly

Según lo que conozco las constantes (lo que creas cuando usas "define()") son de ambito restringido a la ejecución del script que las crea .. es decir .. NO te sirve para estos propósitos. Para eso tienes las sesiones (de ambito "global") o en su defecto cookies.

Un saludo,
  #12 (permalink)  
Antiguo 11/09/2005, 20:23
okram
Invitado
 
Mensajes: n/a
Puntos:
Hola

Use sesiones, como me dijo Cluster, y me va bien... En una pagina x.php creo una variable de sesion
Código PHP:
$_SESSION['_ver_imagen']="permitido"//De hecho no importa el valor XD 
... esto lo hago antes de llamar a la pagina marcar.php mediante un <img>... Luego en la pagina marcar.php:
Código PHP:
<?php
// Aqui algnos includes que se encargaran de iniciar la sesion, autentificar... etc

if(isset($_SESSION['_ver_imagen'])) {
//El codigo que me generara la imagen, pero antes de éste
//elimino la variable de sesión creada
} else {
die 
"Usted no puede ver esta página";
}
?>
Tengo una preguntilla mas, aunq ya se sale del tema un poco XD:

Al momento de elminar la variable, cual de estas lineas de codigo debo usar, de tal manera que isset($_SESSION['variable']) me devuelva false
Código PHP:
//primera forma
$_SESSION['variable']="";

//segunda forma
$_SESSION['variable'] = NULL;

//tercera forma
unset($_SESSION['variable']); 
Estoy interesado en saber un poco mas acerca de como unsetear :S una variable... y que resultado me traeria c/u de las formas anteriores

Salu2
  #13 (permalink)  
Antiguo 11/09/2005, 20:43
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 10 meses
Puntos: 4
unset elimina la variable y tambien la memoria utilizada... esa es la forma correcta de hacerlo.

para destruir la session completa es mejor usar:
session_unset();
session_destroy();
  #14 (permalink)  
Antiguo 11/09/2005, 23:49
 
Fecha de Ingreso: agosto-2005
Mensajes: 109
Antigüedad: 18 años, 8 meses
Puntos: 0
Cluster,

Claro, lo había simplificado demasiado. Yo lo uso así:

uno.php:

Código PHP:
<?php
    define
('DESDE_UNO'1); 

    require_once(
"./dos.php");
    echo 
en_dos();
?>
dos.php:

Código PHP:
<?php
    
if (!defined('DESDE_UNO'))
        die(
"no no no no");

    function 
en_dos() {
        echo 
"si si si si";
    }
?>
  #15 (permalink)  
Antiguo 12/09/2005, 06:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Shockly
Cluster,

Claro, lo había simplificado demasiado. Yo lo uso así:

uno.php:

Código PHP:
<?php
    define
('DESDE_UNO'1); 

    require_once(
"./dos.php");
    echo 
en_dos();
?>
dos.php:

Código PHP:
<?php
    
if (!defined('DESDE_UNO'))
        die(
"no no no no");

    function 
en_dos() {
        echo 
"si si si si";
    }
?>
No comprendí tu sistema bien ..

Si entro a dos.php . OK, no hay un "include" de uno.php donde se define una variable (da igual si es constante o no para estos fines). Ahí quedaría validado.

Pero, si entro a uno.php siempre estaré validado (defines una variable y a continuación llamas a código que la valida .. además del juego de funciones? ..

En resumen .. usando esa técnica .. he de "jugar" (¿es así?) usando funciones definidas en otro script (que no las llame en el mismo script) ...

Creo que es más intuitivo usar sesiones para estos temas.

Un saludo,
  #16 (permalink)  
Antiguo 12/09/2005, 08:43
 
Fecha de Ingreso: agosto-2005
Mensajes: 109
Antigüedad: 18 años, 8 meses
Puntos: 0
Si, creo que te has liado un poco... 'uno.php' es el main y 'dos.php' son las funciones.

Si entras en 'dos.php' directamente obtendrás un 'no no no no' pero si 'uno.php' llama a 'dos.php', se ejecutará lo que allí hubiera.

Es una forma simple y eficaz de proteger sin sesiones.

Haz una cosa Cluster, pruébalo en localhost, que a veces nos empecinamos en no ver y rodándolo se aclara todo.

Un saludo.
  #17 (permalink)  
Antiguo 12/09/2005, 09:25
okram
Invitado
 
Mensajes: n/a
Puntos:
Cita:
Iniciado por Shockly
Cluster,

Claro, lo había simplificado demasiado. Yo lo uso así:

uno.php:

Código PHP:
<?php
    define
('DESDE_UNO'1); 

    require_once(
"./dos.php");
    echo 
en_dos();
?>
dos.php:

Código PHP:
<?php
    
if (!defined('DESDE_UNO'))
        die(
"no no no no");

    function 
en_dos() {
        echo 
"si si si si";
    }
?>
De todas maneras usar define() no sirve en este caso, porque en tu ejemplo usas require_once("./dos.php");, pero el tema de este post estaba referido a un archivo marcar.php que generaba un contenido jpeg (una imagen) y no una pagina html.... concuerdo con Cluster en que sesiones es la mejor manera de hacer lo que planteé al inicio...

Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:43.