[PHP] subdomains readdir

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een klein "programma'tje" gemaakt met php. Het is de bedoeling dat dit programma'tje bestanden uit een bepaalde directory haalt bij een subdomein. Het programma'tje staat alleen in het "hoofddomein". Dus geschetst:

http://www.pino.nl -> staat programma'tje waarin directory wordt uitgelezen
http://sub.pino.nl -> staat de map die uitgelezen moet worden

Volgens mij kan ik met het programma'tje de map niet uit te lezen die staat op http://sub.pino.nl.

Klopt dit? En kan ik er wat aan doen zodat ik er wel bij kan komen. (Ik gebruik plesk als "admin")

Ik heb op google gezocht en hier op GOT, maar ik kan niet iets vinden!

Acties:
  • 0 Henk 'm!

  • NielsNL
  • Registratie: Januari 2002
  • Laatst online: 08-09 20:14

NielsNL

DigiCow

Het subdomein heeft (normaal gesproken) weinig te maken de plek waar je bestanden staan. Uit je verhaal lijd ik af dat je een CMS gebruikt? In ieder geval geen losse Apache, mySQL en PHP installatie? Overigens is "www" ook een subdomein.

[ Voor 8% gewijzigd door NielsNL op 16-01-2007 02:39 ]

M'n Oma is een site aan het haken.


Acties:
  • 0 Henk 'm!

Verwijderd

"Overigens is "www" ook een subdomein"
Sommigen hebben die vervelende neiging om www als subdomein te zien.
Probeer dan ook maar eens uit om domein.extensie en www.domein.extensie uit elkaar te halen.

Acties:
  • 0 Henk 'm!

  • Flard
  • Registratie: Februari 2001
  • Laatst online: 18-09 22:09
Bepaal eerst in php in welke map je root draait, waarschijnlijk kom je erachter dat de volgende map is: (kan afwijken per hoster)
«blablabla»/pino.nl/httpdocs/
Als je nu echter het laatste 'httpdocs' veranderd door
/subdomains/sub/httpdocs/
dan kun je kijken welke bestanden er staan.

Ook zou je natuurlijk met php kunnen achterhalen welke map de root van je subdomein is, en dat in je hoofd'programma' gebruiken.

Het kan ook zijn dat je het hoofddomein leesrechten moet geven op de httpdocs van het subdomein.
Verwijderd schreef op dinsdag 16 januari 2007 @ 06:29:
"Overigens is "www" ook een subdomein"
Sommigen hebben die vervelende neiging om www als subdomein te zien.
Probeer dan ook maar eens uit om domein.extensie en www.domein.extensie uit elkaar te halen.
Strikt genomen is het ook een subdomein, en in een DNS zijn ze hééél gemakkelijk uit elkaar te halen. Helaas (?) wordt uit traditioneel oogpunt www nog meestal gebruikt als 'hoofddomein'.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

readdir is een operatie op filesystem niveau. Via http (dus via de domein naam) zijn dergelijke methoden niet mogelijk. Php heeft wel een omweg die sommige file operaties via http mogelijk maakt, maar dit geldt alleen voor het openen van bestanden, niet van het uitlezen van directories.

Daarnaast is www.x.y gewoon een subdomein van x.y.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Flard schreef op dinsdag 16 januari 2007 @ 10:24:
Bepaal eerst in php in welke map je root draait, waarschijnlijk kom je erachter dat de volgende map is: (kan afwijken per hoster)
«blablabla»/pino.nl/httpdocs/
Als je nu echter het laatste 'httpdocs' veranderd door
/subdomains/sub/httpdocs/
dan kun je kijken welke bestanden er staan.

Ook zou je natuurlijk met php kunnen achterhalen welke map de root van je subdomein is, en dat in je hoofd'programma' gebruiken.

Het kan ook zijn dat je het hoofddomein leesrechten moet geven op de httpdocs van het subdomein.


[...]


Strikt genomen is het ook een subdomein, en in een DNS zijn ze hééél gemakkelijk uit elkaar te halen. Helaas (?) wordt uit traditioneel oogpunt www nog meestal gebruikt als 'hoofddomein'.
De root is inderdaad zoiets als:

«blablabla»/pino.nl/httpdocs/

Ik had ook al geprobeerd (vergeten om erbij te vermelden) om de 'httpdocs' te vervangen door subdomains/sub/httpdocs/

maar op een 1 of andere manier lijkt hij daar niets te kunnen lezen ofzo

Ik heb even nog wat tests uitgevoerd en krijg nu de volgende foutmelding:

Warning: opendir(): open_basedir restriction in effect. File(/home/httpd/vhosts/****/subdomains/pino/httpdocs) is not within the allowed path(s): (/home/httpd/vhosts/****/httpdocs:/tmp) in /home/httpd/vhosts/****/httpdocs/test.php on line 8

Warning: opendir(/home/httpd/vhosts/****/subdomains/pino/httpdocs): failed to open dir: Operation not permitted in /home/httpd/vhosts/****/httpdocs/test.php on line 8

Kan ik hier wat dan doen?
Janoz schreef op dinsdag 16 januari 2007 @ 10:31:
readdir is een operatie op filesystem niveau. Via http (dus via de domein naam) zijn dergelijke methoden niet mogelijk. Php heeft wel een omweg die sommige file operaties via http mogelijk maakt, maar dit geldt alleen voor het openen van bestanden, niet van het uitlezen van directories.

Daarnaast is www.x.y gewoon een subdomein van x.y.
Ik weet dat het alleen op filesysteem niveau werkt, gebruikte alleen de http om de situatie te schetsen. Maar ik had inderdaad beter kunnen vermelden dat ik met absolute paths had gewerkt.

[ Voor 16% gewijzigd door Verwijderd op 16-01-2007 11:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb ondertussen contact gezocht met het bedrijf die de hosting verzorgt. Deze geeft aan dat het niet mogelijk is. Dus helaas. Dan maar even een andere oplossing zoeken.

Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

Een php file in je subdomein maken wat de gewenste map uitleest, en de listing van die printen. Hetzij als plain text, een item per lijn, of nog mooier, in xml formaat.

In je hoofddomein maak je een php script wat gewoon die eerste php file aanroept. Je krijgt dan je listing terug...

Hiermee kun je iig een overzicht maken van de bestanden in dat subdomein. Ik weet niet wat je verder met die bestanden wilt doen, dat vermeld je namelijk niet in je TS, maar voor een lsiting is dit wel te doen...

Edit
Dit is ook misschien wel een leuke optie; ik heb het verder niet getest, dit is zo even uit het hoofd, maar zou kunnen werken. Hier maak je van een variabele een string en geeft die door... Iets efficienter denk ik... ;)

listing.php op http://sub.pino.nl:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
    // Directory openen en door de lijst met bestanden wandelen
    $handle = opendir("./");
    while($file = readdir($handle))
        $file_array = array();

    // Print de zaak
    print base64_encode(serialize($file_array));

?>


Je code op je hoofdomein:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    // Data ophalen
    $data = file("http://sub.pino.nl/listing.php");
    
    // Data terugzetten naar een array
    $file_array = unserialize(base64_decode($data));

    // Door de array heenlopen
    foreach($file_array as $file)
    {
        // Doe met file wat je wilt... ;)
        print $file;
    }
?>

[ Voor 46% gewijzigd door Rowdy.nl op 16-01-2007 12:21 ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Dan moet je host wel allow_url_fopen aan hebben staan, wat veel hosts standaard uit zetten.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

Klopt, probeer dit soort ranzige zaken alleen op mijn lokale testbak, dan denk je daar niet aan... ;)

Maar dat kun je weer ondervangen door curl... Moet je even controleren of je host dat ondersteund. Dan wordt het tweede script zoiets als dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

    // Haal de data op
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, "http://sub.pino.nl/listing.php");
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt ($ch, CURLOPT_USERAGENT, $_ENV['HTTP_USER_AGENT']);
    $data = curl_exec($ch);
    curl_close($ch);

    // Data terugzetten naar een array
    $file_array = unserialize(base64_decode($data));

    // Door de array heenlopen
    foreach($file_array as $file)
    {
        // Doe met file wat je wilt... ;)
        print $file;
    }
?>

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.

Pagina: 1