Include vs Readfile
include() is een veelgebruikte functie om een bestand in php in te lezen. Ook een oorzaak van vele veiligheidslekken in php.
Gesponsorde koppelingen
Inhoudsopgave
31 reacties op 'Include vs Readfile'
Gesponsorde koppelingen
Simpeler af te vangen is het met een file_exists(), of nog mooier een switch lus. Dan hoef je eigenlijk de input niet eens te gebruiken:
switch($input){
case 1 :
include('blaat1.php'); break;
case 2 :
include('blaat2.php'); break;
case 3 :
include('blaat3.php'); break;
default :
case 1 :
include('blaat0.php'); break;
}
switch($input){
case 1 :
include('blaat1.php'); break;
case 2 :
include('blaat2.php'); break;
case 3 :
include('blaat3.php'); break;
default :
case 1 :
include('blaat0.php'); break;
}
@next:
hij zegt niet dat hij het doet mensen maar er zijn genoeg mensen die bijv een link zetten als <a href="index.php?include_file=nieuws.html"> dus dan kan het wel hij waarschuwd de mensen die het wel doen!!! het is een handige tutorial maar als je al snapt wat er staat hoef je er tog niet negatief over te zijn.
@ruud:ik kan boos worden om de reactie van jouw, houd gewoon je bek als je niet eens je mening kan ondersteunen met argumenten.
verder wilde ik zeggen dat het een goeie tutorial is voor net beginnende phpers, thx arend
hij zegt niet dat hij het doet mensen maar er zijn genoeg mensen die bijv een link zetten als <a href="index.php?include_file=nieuws.html"> dus dan kan het wel hij waarschuwd de mensen die het wel doen!!! het is een handige tutorial maar als je al snapt wat er staat hoef je er tog niet negatief over te zijn.
@ruud:ik kan boos worden om de reactie van jouw, houd gewoon je bek als je niet eens je mening kan ondersteunen met argumenten.
verder wilde ik zeggen dat het een goeie tutorial is voor net beginnende phpers, thx arend
Dit gaat er niet om of je wel of geen include() moet gebruiken, maar het gaat er om dat je je invoer moet valideren.
Overigens, ben ik het wel met je eens dat je geen include() moet gebruiken, maar om een hele andere reden. Namelijk dat je uiteindelijk ieder bestand maar een keer wilt includen over het algemeen. "Cannot redefine function x" variabele overschijven, dezelfde foutmelding voor classes ed. Gebruik lekker include_once().
Overigens, ben ik het wel met je eens dat je geen include() moet gebruiken, maar om een hele andere reden. Namelijk dat je uiteindelijk ieder bestand maar een keer wilt includen over het algemeen. "Cannot redefine function x" variabele overschijven, dezelfde foutmelding voor classes ed. Gebruik lekker include_once().
wat ik zelf meestal op mijn pages doe is het volgende..
Deze manier is ook wel redelijk veilig volgens mij.
Deze manier is ook wel redelijk veilig volgens mij.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// array aanmaken voor de nav (kan je ook dynamisch uit db trekken ofzo)
$nav = array('home', 'downloads', 'contact', 'enz');
// nav naar browser echo-en
foreach($nav as $link) {
echo '<a href="index.php?page='.$link.'" title="go to the '.$link.' page">'.ucfirst($link).'</a><br>';
}
// kijken of $_GET['page'] bestaat en in de array staat
$page = isset($_GET['page'], $nav) ? $_GET['page'] : "home";
$page = in_array($page, $nav) ? $page : "home";
// page includen
include('includes/'.$page.'_inc.php');
?>
// array aanmaken voor de nav (kan je ook dynamisch uit db trekken ofzo)
$nav = array('home', 'downloads', 'contact', 'enz');
// nav naar browser echo-en
foreach($nav as $link) {
echo '<a href="index.php?page='.$link.'" title="go to the '.$link.' page">'.ucfirst($link).'</a><br>';
}
// kijken of $_GET['page'] bestaat en in de array staat
$page = isset($_GET['page'], $nav) ? $_GET['page'] : "home";
$page = in_array($page, $nav) ? $page : "home";
// page includen
include('includes/'.$page.'_inc.php');
?>
include/include_once/require/require_once/file/file_get_contents/readfile zijn allemaal gevaarlijk voor deze manier van hacken.
Het heeft geen enkele zin om require te gebruiken, of include_once. Sterker; include_once() zou ik afraden; zorg liever dat je je code gewoon maar 1 keer include.
Dit probleem kun je heel simpekl uit de wereld helpen op drie manieren:
1. zet enable_url_fopen uit in php.ini of .htacccess. Zelfs als een hacker een URL in je script kan krijgen zal PHP weigeren die op te halen
2. geef nooit teksten door, altijd getallen, en haal aan de hand van die getallen de echte teksten weer op:
script.php?include_bestand=5
3. zet altijd een hardcoded pad voor de var, en haal alle dubbele punten uit de var:
include('/mijn/pad/'.str_replace('..', $_GET['include_bestand']);
Maar de 1e methode is het best omdat het daar helemaal onmogelijk is om iets anders in te voeren dan de optie die jij toestaat. De 2e optie is altijd wel een goed plan, hoe vaak haal je in je scripts nou iets op van een andere site?
Het heeft geen enkele zin om require te gebruiken, of include_once. Sterker; include_once() zou ik afraden; zorg liever dat je je code gewoon maar 1 keer include.
Dit probleem kun je heel simpekl uit de wereld helpen op drie manieren:
1. zet enable_url_fopen uit in php.ini of .htacccess. Zelfs als een hacker een URL in je script kan krijgen zal PHP weigeren die op te halen
2. geef nooit teksten door, altijd getallen, en haal aan de hand van die getallen de echte teksten weer op:
script.php?include_bestand=5
Code (php)
3. zet altijd een hardcoded pad voor de var, en haal alle dubbele punten uit de var:
include('/mijn/pad/'.str_replace('..', $_GET['include_bestand']);
Maar de 1e methode is het best omdat het daar helemaal onmogelijk is om iets anders in te voeren dan de optie die jij toestaat. De 2e optie is altijd wel een goed plan, hoe vaak haal je in je scripts nou iets op van een andere site?
Wat ik gebruik is meestal een constante in de include, dus:
define( 'P_SRC', '/usr/home/apache/htdocs/include/' );
include P_SRC.'class.mysql.php';
Beter dan een hardcoded pad in de include.
Include en require zijn niet hetzelfde trouwens. Require wordt altijd toegevoerd en include niet, dus:
if( $string == 'hallo' )
include iets
is niet hetzelfde als
if( $string == 'hallo' )
require iets
define( 'P_SRC', '/usr/home/apache/htdocs/include/' );
include P_SRC.'class.mysql.php';
Beter dan een hardcoded pad in de include.
Include en require zijn niet hetzelfde trouwens. Require wordt altijd toegevoerd en include niet, dus:
if( $string == 'hallo' )
include iets
is niet hetzelfde als
if( $string == 'hallo' )
require iets
> include/include_once/require/require_once/file/file_get_contents/readfile zijn
> allemaal gevaarlijk voor deze manier van hacken.
Mee eens, wie niet horen wil moet maar voelen. Alles is onveilig als iemand dom programmeert.
>Het heeft geen enkele zin om require te gebruiken, of include_once. Sterker;
> include_once() zou ik afraden; zorg liever dat je je code gewoon maar 1 keer
> include.
Heel leuk dat je het afraad, hoor. Maar waarom? Het enige wat je er mee bereikt is dat straks alles vanaf een bestand afhankelijk word of in iedergeval dat je moet bij gaan houden wat je waar include. Erg prettig vind ik dit zelf niet, en duidelijk is het evenmin omdat je nooit weet op welk script je nou weer vertrouwd :)
> 2. geef nooit teksten door, altijd getallen, en haal aan de hand van die getallen
> de echte teksten weer op:
Een hashtable (of assoctieve array) gaat ook :)
> 3. zet altijd een hardcoded pad voor de var, en haal alle dubbele punten uit de
> var:
> include('/mijn/pad/'.str_replace('..', $_GET['include_bestand']);
Behalve dat de code niet gaat werken omdat je een parameter bent vergeten bij str_replace, waarom een hardcoded pad? Erg onderhoudbaar is het IMHO niet echt...
Zelf doe ik het trouwens zo dat iedere directory een rootpath.php krijgt, met daar in
Waarbij ./../ altijd naar de root van de applicatie verwijst. Zodat ik, 1 nooit hoef te weten waar mijn applicatie uberhaupt bestaat. En het altijd makkelijk is om bestanden te verhuizen binnen mijn applicatie, omdat het enige wat ik hoef te doen het aanpassen van het relatieve pad naar de root dir is.
> Include en require zijn niet hetzelfde trouwens. Require wordt altijd toegevoerd
> en include niet, dus:
Leescht:
> Note:
> Prior to PHP 4.0.2, the following applies: require() will always attempt to read
> the target file, even if the line it's on never executes. The conditional statement > won't affect require(). However, if the line on which the require() occurs is not
> executed, neither will any of the code in the target file be executed. Similarly,
> looping structures do not affect the behaviour of require(). Although the code
> contained in the target file is still subject to the loop, the require() itself happens
> only once.
> allemaal gevaarlijk voor deze manier van hacken.
Mee eens, wie niet horen wil moet maar voelen. Alles is onveilig als iemand dom programmeert.
>Het heeft geen enkele zin om require te gebruiken, of include_once. Sterker;
> include_once() zou ik afraden; zorg liever dat je je code gewoon maar 1 keer
> include.
Heel leuk dat je het afraad, hoor. Maar waarom? Het enige wat je er mee bereikt is dat straks alles vanaf een bestand afhankelijk word of in iedergeval dat je moet bij gaan houden wat je waar include. Erg prettig vind ik dit zelf niet, en duidelijk is het evenmin omdat je nooit weet op welk script je nou weer vertrouwd :)
> 2. geef nooit teksten door, altijd getallen, en haal aan de hand van die getallen
> de echte teksten weer op:
Een hashtable (of assoctieve array) gaat ook :)
> 3. zet altijd een hardcoded pad voor de var, en haal alle dubbele punten uit de
> var:
> include('/mijn/pad/'.str_replace('..', $_GET['include_bestand']);
Behalve dat de code niet gaat werken omdat je een parameter bent vergeten bij str_replace, waarom een hardcoded pad? Erg onderhoudbaar is het IMHO niet echt...
Zelf doe ik het trouwens zo dat iedere directory een rootpath.php krijgt, met daar in
Waarbij ./../ altijd naar de root van de applicatie verwijst. Zodat ik, 1 nooit hoef te weten waar mijn applicatie uberhaupt bestaat. En het altijd makkelijk is om bestanden te verhuizen binnen mijn applicatie, omdat het enige wat ik hoef te doen het aanpassen van het relatieve pad naar de root dir is.
> Include en require zijn niet hetzelfde trouwens. Require wordt altijd toegevoerd
> en include niet, dus:
Leescht:
> Note:
> Prior to PHP 4.0.2, the following applies: require() will always attempt to read
> the target file, even if the line it's on never executes. The conditional statement > won't affect require(). However, if the line on which the require() occurs is not
> executed, neither will any of the code in the target file be executed. Similarly,
> looping structures do not affect the behaviour of require(). Although the code
> contained in the target file is still subject to the loop, the require() itself happens
> only once.
@kees: je kan nog altijd ../../bestand.php erinzetten he en ik denk http://www.site.be/bestand.php ook dacht ik
@kees: Ik ben het helemaal met je eens ! Ik heb een functie gemaakt die kijkt of $bestand bestaat in een opgegeven directory op de server zo niet dan gaat hij terug naar de index pagina. En dat je altijd nummers moet gebruiken zoals vincent klopt volgensmij ook niet maargoed het is net wat je fijn vind en wat je mooi vind.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
foreach($_GET as $k => $v){
if(preg_match('/^[a-z0-9%&+\s]*$/i', urldecode($v), $tar)){
$this->globarr['get'][$k] = urldecode($v);
}
}
?>
foreach($_GET as $k => $v){
if(preg_match('/^[a-z0-9%&+\s]*$/i', urldecode($v), $tar)){
$this->globarr['get'][$k] = urldecode($v);
}
}
?>
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Arend a- 9 jaar geleden
- 1.357 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Beveiliging
- Nieuwste PHP tutorials
- PHP tutorial toevoegen


PHP hulp
0 seconden vanaf nu