[PHP] probleem bij lay-out scheiden van content

Pagina: 1
Acties:
  • 544 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit momenteel even met een klein probleempje, die waarschijnlijk voortkomt uit het te lang er over zitten denken.

Wat is het geval, ik heb een systeem waarvoor inlog noodzakelijk is. Nu wil ik voor alle pagina's de terugkerende "aspecten" scheiden van de content (die dus van pagina tot pagina verschilt). Dit wil ik doen door middel van het includen van php bestanden.

De structuur zou er zo uit kunnen zien:

pagina.php (hoofdpagina)
includes/header.php (include voor de hoofdpagina)

Aangezien ik niet wil dat de header.php direct te benaderen is, heb ik hier dezelfde check ingebouwd als in pagina.php (sessie check).

Wat is nu het probleem, als ik header.php aanroep vanuit pagina.php kloppen de referenties in header.php niet want deze zijn om de sercurity toe te voegen relatief ten opzichte van header.php, terwijl als ik deze include ze natuurlijk ten opzichte van pagina.php zouden moeten zijn. Hier zit dus de contradictie waar ik nu even geen oplossing voor weet.

Wat voorbeeld code:
pagina.php:
PHP:
1
2
3
4
5
6
7
8
<?php
include('includes/security.php'); // dit zorgt voor de afhandeling van de security
?>
<html>
...
<?php
include('includes/header.php'); // hier wordt de header ingeladen
?>


includes/header.php
PHP:
1
2
3
4
5
6
7
8
<?php
include('security.php'); 
/* hier wordt dus relatief aan header.php de security ingeladen 
(wat bij de include op pagina.php natuurlijk problemen oplevert)
*/
?>

// verdere header opmaak


ps. overbodig wellicht, maar header.php moet dus eigenlijk wel "uitgevoerd" worden en slechts de opgemaakte html terug geven, eigenlijk lost dit volgens mij m;n probleem op, alleen weet ik niet hoe dat gaat.

[ Voor 7% gewijzigd door Verwijderd op 12-04-2007 13:04 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Kun je iets met chdir() niet iets?

EDIT: Desnoods haal je aan het begin van header.php de cwd op met getcwd() en zet je die na de include terug, zodat andere dingen ook niet van slag raken.

[ Voor 59% gewijzigd door Patriot op 12-04-2007 13:07 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je hebt verschillende opties.
1.) Zorg dat je include-dir ook "./includes/" bevat, waardoor je gewoon security.php kunt includen.

2.) Zet die header.php buiten je webdir, waardoor hij niet eens te benaderen is.

(bijv, als je webdir /usr/local/www/webroot/ is, zet je je includes in /usr/local/www/includes/), zo kun je, ook weer middels de include-dir setting van php altijd makkelijk includen en alles van buitenaf afscheiden wat je wilt.

3.) Ook is het handig om na te gaan of het uberhaupt uitmaakt of iemand die header file van buitenaf kan aanroepen, vaak heeft dat namelijk geen enkel nut en geen enkele impact op je security.

4.) 1 entrypoint afdwingen, bij mij komt altijd elke request binnen op de index.php in mijn webroot. Dit kun je realiseren op verschillende manieren.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee, dus op die manier zorg je ervoor dat hij altijd vanuit de juiste directory redeneert. Klinkt wel goed, maar is dat echt de enige oplossing?

Ik heb al zitten denken, eigenlijk is het vergelijkbaar met een Ajax verzoek, ik include een reeds geparsde PHP pagina... ik zou verwachten dat hier toch een zeer eenvoudige oplossing voor is, alleen ik kom er echt niet op!

Acties:
  • 0 Henk 'm!

Verwijderd

in /includes een .htaccess bestandje met "Deny from All" zorgt er voor dat je er niet 'van buiten' bij kan. Volgens mij lost 't je probleem wel op.

[edit]
Hetzelfde wordt overigens bereikt met oplossing 2 van Grijze Vos.

[ Voor 21% gewijzigd door Verwijderd op 12-04-2007 13:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 12 april 2007 @ 13:26:
in /includes een .htaccess bestandje met "Deny from All" zorgt er voor dat je er niet 'van buiten' bij kan. Volgens mij lost 't je probleem wel op.

[edit]
Hetzelfde wordt overigens bereikt met oplossing 2 van Grijze Vos.
Kan de server zelf er nog wel bij op deze manier?? Dan is dit inderdaad de oplossing!

Maar toch had ik verwacht dat er een oplossing zou zijn op het vlak van, direct includen van pre-parsed php. Oftewel, een bestand rechtstreeks inlezen in een document zodat in werkelijkheid alleen de html gebruikt wordt.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 12 april 2007 @ 13:32:
[...]


Kan de server zelf er nog wel bij op deze manier?? Dan is dit inderdaad de oplossing!
Probeer het eens zou ik zeggen ;)

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Je kunt ook met defines werken:

header.php
PHP:
1
2
3
4
5
6
<?php
if(!is_defined("IN_APP"))
{
  die("Mag niet direct aangeroepen worden.");
}
?>



Index.php:
PHP:
1
2
3
4
5
<?php
define("IN_APP", true);

include("header.php");
?>


Op die manier moet die define (IN_APP) gemaakt zijn om de pagina überhaupt te laten laden. :)

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Het is defined(), niet is_defined() ;-)
Pagina: 1