[PHP] Controleren of een bestand is ge-include

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Ik zal mijn probleem even simpel weergeven; ik heb 2 bestanden index.php en menu.php. Ik include menu.php in index.php.

Maar het kan ook gebeuren dat mensen direct menu.php opvragen, dat wil ik voorkomen. Hoe kan ik controleren of menu.php direct is opgevraagt en niet is ge-include?

Acties:
  • 0 Henk 'm!

  • MissingDog
  • Registratie: Augustus 2002
  • Niet online
zet een define op in je index.php en controleer in je menu.php of deze geset is, anders die();

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

index.php:
PHP:
1
define("INDEX_REQUESTED", true);
menu.php:
PHP:
1
if(!INDEX_REQUESTED) { die(); }

[ Voor 65% gewijzigd door JHS op 20-02-2006 18:34 ]

DM!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

De beste manier lijkt me gewoon door menu.php buiten de webroot te plaatsen ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
Ik zou voor de manier van JHS gaan. Twee alternatieven kunnen zijn:
  • $_SERVER['HTTP_REFERER'] variabele controleren in menu.php
Als deze leeg is dan is menu.php direct aangeroepen. Anders zit hierin de url van de pagina waar je vandaan kwam. Nadeel is dat dit ook handmatig gezet kan worden en het wordt niet door alle browsers hetzelfde afgehandeld.
  • Sessievariabele aanmaken in index.php en hierop controleren in menu.php
Lijkt een beetje op die constante oplossing. Als je van plan was sessies te gaan gebruiken in je scripts dan kun je die gelijk voor dit doeleinde gebruiken.

[ Voor 20% gewijzigd door seamus21 op 20-02-2006 18:45 ]

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 17:05

orf

Andere oplossing kan ook nog:

PHP:
1
2
3
4
5
6
7
<?php

if(strtolower(basename($_SERVER['PHP_SELF'])) == strtolower(basename(__FILE__))) {
    die('Dit bestand kan niet direct aangeroepen worden');
}

?>


Eventueel kun je in een .htaccess bestandje ook nog een deny for all zetten voor dit bestand of een complete map.


edit:
$_SERVER['HTTP_REFERER'] variabele controleren in menu.php
Als deze leeg is dan is menu.php direct aangeroepen. Anders zit hierin de url van de pagina waar je vandaan kwam. Nadeel is dat dit ook handmatig gezet kan worden en het wordt niet door alle browsers hetzelfde afgehandeld.
Probeer dit maar eens :)
Deze zal nooit index.php bevatten als menu.php included in index.php is.
Daarnaast zul je nóóit voor veiligheid op referrer moeten controleren.

[ Voor 46% gewijzigd door orf op 20-02-2006 18:55 ]


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 12:47
JHS schreef op maandag 20 februari 2006 @ 18:32:
menu.php:
PHP:
1
if(!INDEX_REQUESTED) { die(); }
Deze methode heb ik een keer gebruikt in combinatie met error_reporting op E_ALL, met als resultaat de volgende melding:
Notice: Use of undefined constant IS_INCLUDE - assumed 'IS_INCLUDE'

En aangezien php variabelen automatisch omzet, in dit geval van een string naar een bool (string met inhoud, dus 'true'), werd de pagina gewoon getoond.

Nu gebruik ik deze methode, is dit een goede oplossing?
code:
1
if ( IS_INCLUDE != 'IS_INCLUDE' )

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Die methode van JHS moet je gewoon doen als if(!isset(BLA)) die();, dan doe je niets met de var als die niet gedefinieerd is. :)

O ja, defined() is voor constanten. O-)

[ Voor 15% gewijzigd door Voutloos op 20-02-2006 19:06 ]

{signature}


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 17:05

orf

PHP:
1
2
3
if (!defined('INDEX_REQUESTED')){
  die();
}

[ Voor 14% gewijzigd door orf op 20-02-2006 19:06 ]


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 12:47
Ah, dat is inderdaad makkelijker dan wat ik er van gemaakt had, bedankt.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Bedankt !

Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
orf schreef op maandag 20 februari 2006 @ 18:52:
Andere oplossing kan ook nog:

PHP:
1
2
3
4
5
6
7
<?php

if(strtolower(basename($_SERVER['PHP_SELF'])) == strtolower(basename(__FILE__))) {
    die('Dit bestand kan niet direct aangeroepen worden');
}

?>
Dit werkt jammergenoeg niet. Hij geeft ook true als hij gewoon ge-include wordt.
Ik doe misschien iets fout, ik ga er nog even naar kijken.

Edit: ik weet al waarom.... de file die ik include heet ook index.php. Deze code werkt alleen als de namen van de bestanden verschillend zijn.

[ Voor 90% gewijzigd door verytallman op 20-02-2006 20:33 ]


Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
kijk eens naar de functie, get_included_files http://nl3.php.net/get_included_files

Pascal


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Los daarvan kan je je natuurlijk af vragen of het wel handig is dat die te includen file ook index.php heet. Er is vsat wel een logischere, beter beschrijvende naam voor te verzinnen. :)

{signature}


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
verytallman schreef op maandag 20 februari 2006 @ 20:11:
Edit: ik weet al waarom.... de file die ik include heet ook index.php. Deze code werkt alleen als de namen van de bestanden verschillend zijn.
Basename vervangen door realpath kan een oplossing zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Er staat ook een nuttige comment in de functie omschrijving van get_included_files die precies over deze include-situatie gaat:

PHP:
1
2
if(__FILE__ != $_SERVER['SCRIPT_FILENAME']) {
}

[ Voor 21% gewijzigd door Verwijderd op 21-02-2006 09:28 ]

Pagina: 1