[PHP] Uitlezen van dir's buiten DocumentRoot

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • programist
  • Registratie: Mei 2003
  • Laatst online: 26-12-2018
Tweakers,

Ik probeer een directory uit te lezen die buiten mijn DocumentRoot directory zit. Ik heb inmiddels de directory wel kunnen defineren in de httpd.conf van apache (windows server) en kan deze ook benaderen binnen de url. Hiermee krijg ik leuk een standart "Index of /" te zien met alle dirs.

code:
1
2
3
4
5
6
7
8
9
10
 httpd.conf

  Alias /dir/ "X:/"

    <Directory "X:/">
        Options FollowSymLinks Indexes Includes     
        Order Allow,Deny
        Allow from All  
        AllowOverride All
    </Directory>


Het uitlezen van de dir's binnen de DocumentRoot gaat prima, geen probleme hier, alleen ik kan op geen enkele manier de dirs uit de andere directory ( X:/ ) uitlezen.

De dir's binnen DocumentRoot lees ik uit met een standart opendir() en readdir() functie alleen is dit volgens mij niet mogelijk met de dir's buite de DocumentRoot aangezien ze er niet fisiek aanwezig zijn.

Heeft iemand een iedee?

ps. mocht code nodig zijn kan ik het hier posten maar lijkt me niet echt nodig aangezien het om standart functies gaat. En ja ik heb me rot gegoogled.

alvast bedankt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

programist schreef op dinsdag 05 december 2006 @ 01:39:
De dir's binnen DocumentRoot lees ik uit met een standart opendir() en readdir() functie alleen is dit volgens mij niet mogelijk met de dir's buite de DocumentRoot aangezien ze er niet fisiek aanwezig zijn.
Die Apache configuratie heb je hiervoor helemaal niet nodig voor zover ik weet. Alles wat je nodig hebt zijn die twee functies die je inderdaad al noemt; als safe mode niet aan staat in php.ini zou dat gewoon moeten werken. Als safe mode uit staat en het werkt niet, dan zullen we toch echt wat relevante code moeten zien om je te kunnen helpen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • programist
  • Registratie: Mei 2003
  • Laatst online: 26-12-2018
Thx voor je reply,

Heb het geprobeerd met safe mode, helaas geen effect.

code is vrij simpel (standart php.net code)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$dir = $_SERVER['HTTP_HOST'].'/dir/';
//uitlezen van dirs
if (is_dir($dir)) {
   if ($dh = opendir($dir)) {
       while (($file = readdir($dh)) !== false) {
           echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
       }
       closedir($dh);
   }
}
?> 

[ Voor 31% gewijzigd door programist op 05-12-2006 03:13 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En als je de map direct aanspreekt?
PHP:
2
$dir = 'X:/';

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • programist
  • Registratie: Mei 2003
  • Laatst online: 26-12-2018
-NMe- schreef op dinsdag 05 december 2006 @ 02:50:
En als je de map direct aanspreekt?
PHP:
2
$dir = 'X:/';
Dit werkt inderdaad super :), alles kom ik bij probleem nummer 2.

Ik kan ze nu listen maar niet als <a href> gebruiken...

Mijn code:

$dirs[] is gewoon de inhoud van een map

PHP:
1
2
3
4
5
..
<a href="<?php echo $_SERVER['PHP_SELF'].'?dir='.urlencode($leadon.$dirs[$i]);?>" 
class="<?php echo $class;?>"><img src="X/folder.png" 
alt="<?php echo $dirs[$i];?>" /><strong><?php echo $dirs[$i];?></strong>
<em>-</em> <?php echo date ("M d Y h:i:s A", filemtime($leadon.$dirs[$i]));?></a>


punt is als ik $dir = "X:/" gebruik gaat hij uiteindelijk proberen om een link te maken naar X:/bestand.
aangezien dit client side is gaat het niet lukken...

Excuses voor mijn kromme uitleg, ik ben geen programeur dus waarschijnlijk is het allemaal erg krom..

Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20-09 16:45
Ik include zo ongeveer al m'n php-code van buiten de document root. En ik dat nu doe met
code:
1
include('../include/home.php');

Of met
code:
1
include ('/httpdocs/include/home.php');

Het lukt altijd. Dat zal toch met een readdir niet anders zijn. Ik heb de volgende code getest:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?
$dir = '../../';
//uitlezen van dirs
if (is_dir($dir)) {
   if ($dh = opendir($dir)) {
       while (($file = readdir($dh)) !== false) {
           echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
       }
       closedir($dh);
   }
}
?>

En dat werkte als een zonnetje. (op een linux doos waar shared hosting draait btw)

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20-09 16:45
programist schreef op dinsdag 05 december 2006 @ 03:12:
[...]


Dit werkt inderdaad super :), alles kom ik bij probleem nummer 2.
Die
code:
1
$leadon.

Hoort er imho niet tussen.

[ Voor 62% gewijzigd door StevenK op 05-12-2006 03:18 ]

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • programist
  • Registratie: Mei 2003
  • Laatst online: 26-12-2018
StevenK schreef op dinsdag 05 december 2006 @ 03:18:
[...]

Die
code:
1
$leadon.

Hoort er imho niet tussen.
Thx,

$leadon hoort er wel maar dat is iets anders :

In dit geval is het voor het uitlezen van huidige dir : if($leadon=='.') $leadon = ''; en $startdir = '.';
Dit moet op een of ander manier aangepast worden naar de dir buiten DocumentRoot

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
if(!function_exists('imagecreatetruecolor')) $showthumbnails = false;
$leadon = $startdir;
if($leadon=='.') $leadon = '';
if((substr($leadon, -1, 1)!='/') && $leadon!='') $leadon = $leadon . '/';
$startdir = $leadon;

if($_GET['dir']) {
    //check this is okay.

    if(substr($_GET['dir'], -1, 1)!='/') {
        $_GET['dir'] = $_GET['dir'] . '/';
    }

    $dirok = true;
    $dirnames = split('/', $_GET['dir']);
    for($di=0; $di<sizeof($dirnames); $di++) {

        if($di<(sizeof($dirnames)-2)) {
            $dotdotdir = $dotdotdir . $dirnames[$di] . '/';
        }

        if($dirnames[$di] == '..') {
            $dirok = false;
        }
    }

    if(substr($_GET['dir'], 0, 1)=='/') {
        $dirok = false;
    }

    if($dirok) {
         $leadon = $leadon . $_GET['dir'];
    }
}

[ Voor 8% gewijzigd door programist op 05-12-2006 03:28 ]


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20-09 16:45
Sorry, 't is al laat; je weet in welke fysieke map het spul staat en je weet welke virtuele map daar in je webserver bij hoort. Dan moet je in die href toch niet de fysieke map, maar de virtuele map ervoor zetten ?

Een regeltje
PHP:
1
$leadon='/dir/';

Voor je de href gaat bouwen zou imho genoeg moeten zijn.

Was advocaat maar vindt het juridische nog steeds leuk

Pagina: 1