Include vs Readfile

Door Arend a, 24 jaar geleden, 6.208x bekeken

include() is een veelgebruikte functie om een bestand in php in te lezen. Ook een oorzaak van vele veiligheidslekken in php.

Gesponsorde koppelingen

Inhoudsopgave

  1. Include(): het 'lek'
  2. Oplossingen

 

Er zijn 31 reacties op 'Include vs readfile'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Mitch X
Mitch X
24 jaar geleden
 
0 +1 -0 -1
Beter fopenen ;)
Bram Z
Bram Z
24 jaar geleden
 
0 +1 -0 -1
require('') is toch nog beter
Arend a
Arend a
24 jaar geleden
 
0 +1 -0 -1
Maakt geen fuck uit, require doet precies het zelfde als include(), alleen als hij de file niet kan laden geef hij een kritieke fout.
De VeeWee
de VeeWee
24 jaar geleden
 
0 +1 -0 -1
wel een paar fouten, op pagina 1 gebruik je ergens $_POST waar het $_GET moet zijn en op pagina 2 gebruik je zo een variabele :

${variabele} dat moet {$variabele] zijn (dacht ik toch :s)


24 jaar geleden
 
0 +1 -0 -1
Wat een domme tutorial.


24 jaar geleden
 
0 +1 -0 -1
Dat jou script gegevens van een andere site leest en/of uitvoert is geheel afhankelink van hoe je script in elkaar zit. Verder vindt ik dat er in deze tutorial geen overtuigende voorbeelden worden gegeven en alleen elke die door n00bs worden gebruikt.
Winston Smith
Winston Smith
24 jaar geleden
 
0 +1 -0 -1
Je zou ook een switch (of evt. een database query) kunnen gebruiken indien het opgegeven bestand bestaat, en als het bestaat het bestand vervolgens openen. Alle andere (onacceptabele) inputs worden vervolgens op een elegante wijze afgehandeld.


24 jaar geleden
 
0 +1 -0 -1
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;
}
SerpenT
SerpenT
24 jaar geleden
 
0 +1 -0 -1
@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
PrisonerOfPain
PrisonerOfPain
23 jaar geleden
 
0 +1 -0 -1
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().
The Beeding Clown
The Beeding Clown
23 jaar geleden
 
0 +1 -0 -1
wat ik zelf meestal op mijn pages doe is het volgende..
Deze manier is ook wel redelijk veilig volgens mij.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');

?>
Vincent elschot
vincent elschot
23 jaar geleden
 
0 +1 -0 -1
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
$aArray
= array();
$aArray[1] = 'forum.php';
$aArray[5] = 'faq.php';
include($aArray[$_GET['include_bestand']);
?>


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?


23 jaar geleden
 
0 +1 -0 -1
wat dacht je van het bestand buiten de www dir zetten en dan gewoon includen ?
Legolas
Legolas
23 jaar geleden
 
0 +1 -0 -1
het mooie is natuurlijk wel dat als je php vanaf een andere server include dat het dan al geparset is :)


23 jaar geleden
 
0 +1 -0 -1
"het mooie is natuurlijk wel dat als je php vanaf een andere server include dat het dan al geparset is :)"

en als je nou is een extern .txt bestand include met php erin? parstie ook gewoon
Martijn B
Martijn B
23 jaar geleden
 
0 +1 -0 -1
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
PrisonerOfPain
PrisonerOfPain
23 jaar geleden
 
0 +1 -0 -1
> 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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php if(!defined('ROOTPATH')) define('ROOTPATH', './../') ?>

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.
Martijn B
Martijn B
23 jaar geleden
 
0 +1 -0 -1
Ok, dacht altijd dat het anders was (PHP3 enzo ;D )...


23 jaar geleden
 
0 +1 -0 -1
damn wat doen jullie allemaal moeilijk zeg!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
if( file_exists( $bestand ) )
{

  include( $bestand );
}

?>


Tadaa :D
Hipska BE
Hipska BE
23 jaar geleden
 
0 +1 -0 -1
@kees: je kan nog altijd ../../bestand.php erinzetten he en ik denk http://www.site.be/bestand.php ook dacht ik
Arend a
Arend a
23 jaar geleden
 
0 +1 -0 -1
Podverdrie, mijn titel is eigenlijk wel een beetje misleidend. Het idee was eigenlijk mensen op lichte wijze op xss gevaren te wijzen. Ik denk dat hier in de thread hier boven een flink aantal goede oplossingen worden geboden.

Happy camping,

Adje


23 jaar geleden
 
0 +1 -0 -1
@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.
Jonathan Dequeker
Jonathan Dequeker
21 jaar geleden
 
0 +1 -0 -1
Bedankt voor de readfile() oplossing!
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Tegenwoordig kan er van vrijwel geen enkele host nog externe bestanden geincluded worden.
Arend a
Arend a
21 jaar geleden
 
0 +1 -0 -1
Dat mag ik hopen ja, maar er zijn nog steeds veel onveilige bakken die register globals gebruiken en andere rare instellingen die php tot zo'n onveilig medium hebben gemaakt.
Paul K
Paul K
21 jaar geleden
 
0 +1 -0 -1
include("../../verbind.php");

dit is dan toch wel nog gewoon veilig????
K i p
K i p
21 jaar geleden
 
0 +1 -0 -1
Ja
Jannes
jannes
21 jaar geleden
 
0 +1 -0 -1
Wat is hier het nut van??
Als hacker bedoel ik dan, als deze een 'foute' pagina includet, is hij toch de enige die dit ziet, alle andere bezoekers zien toch wat ze moeten zien??
TJVB tvb
TJVB tvb
21 jaar geleden
 
0 +1 -0 -1
@Jannes, het wordt wel vervelend als de betreffende hacker met behulp van die fout pagina bijvoorbeeld queries kan uitvoeren op je database
Roy Brattinga
Roy Brattinga
19 jaar geleden
 
0 +1 -0 -1
Leuke tut, heb nog niet veel verstand van PHP, maar ik gebruik deze include voor mijn website (vrij oud, een keer gekregen)
deze noem ik include.php en zo include in de hele website

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$pagina
= $_GET['pagina'];

if($pagina=="home") {
include ('home.php'); }


if($pagina=="agenda") {
include ('agenda.php'); }

if($pagina=="linkpagina") {
include ('linkpagina.php'); }

//
if (!isSet($pagina)) {
include ('home.php'); }
?>


Werkt prima, maar ga hem denk maar eens veranderen :P
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Mathijs -
Mathijs -
19 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
        }
    }


?>

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Include(): het 'lek'
  2. Oplossingen

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.