[PHP] Goed beveiligen files voor gebruikers

Pagina: 1
Acties:

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 16-08 20:53
Op dit moment loop ik tegen een include probleem aan met PHP.

Ik heb een webserver met daarop een belangrijke site, en wat sites van andere gebruikers.

De open_basedir patch staat niet ingesteld op '.'. Dit betekend dat iedereen in elkaars directory's mag includen (include hoort ook bij de fopen/gzopen functies voor zover ik weet).

Ok, nu wil ik dit best op een . zetten, zodat een script alleen mag includen in de directory waarin het zelf staat. Hierdoor zou alleen de main site stoppen met werken, omdat deze goed gebruik maakt van includes zoals ../iets.inc.php

Maar zelfs als dat zou worden opgelost, maken dan niet veel forum's of andere software gebruik van .. include manieren?

Ook vroeg ik me nog af hoe PHP reageert, als je bijvoorbeeld open_basedir op '/web/' zet, en je als include opgeeft ../etc/passwd ... (dit kan niet, omdat met safemode PHP de owner controleert).

Werkt het goed om open_basedir op '.' te zetten, is het te omzeilen, en is het aan te raden?

Nog wat interessante informatie: http://nl2.php.net/features.safe-mode

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 28-07 15:42

RvdH

Uitvinder van RickRAID

pierre-oord schreef op 28 september 2004 @ 14:57:
Ook vroeg ik me nog af hoe PHP reageert, als je bijvoorbeeld open_basedir op '/web/' zet, en je als include opgeeft ../etc/passwd ... (dit kan niet, omdat met safemode PHP de owner controleert).
Hiermee geef je zelf al aan dat je de oplossing weet voor je probleem: iedere website een eigen gebruikersnaam geven.

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 16-08 20:53
RickJansen schreef op 28 september 2004 @ 15:21:
[...]


Hiermee geef je zelf al aan dat je de oplossing weet voor je probleem: iedere website een eigen gebruikersnaam geven.
Ja, dat is idd een oplossing, maar maakt het beheer wel lastiger, alhoewel ik het zelfs automatisch zou kunnen doen.

Maar alsnog blijft me vraag dan:
Is werken met een . goed? Of gaan een hoop standaard scripts dan niet meer werken voor gebruikers?

Werken massa-hosting bedrijven ook op de manier van verschillende userid's?

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


Verwijderd

Wat ik bij veel hosts al heb gezien is dat ze PHP door een CGI-PHP wrapper halen welke niet onder user apache draait, daardoor heb je geen openbase-dir probleem meer.

Ik heb beter geweten hoe dit werkt ben t even kwijt, maar met wat zoek werk moet je ook zelf wel verder kunnen komen.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 18:37
Dit topic lijkt me meer thuis in Software Algemeen dan in Non-Windows Operating Systems. Bij deze dus een verplaatsing ;)

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Het lijkt mij logischer om gewoon te testen wat er gebeurt :) Dus zet een php_flag met een open_basdir erin en kijk wat er gebeurt op een testdomein. Ik denk dat het allemaal wel goed zal gaan. Slechts een '.' lijkt me trouwens niet handig; maar waarom zou je niet de webroot als basedir opgeven? :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 18-07 21:03
Wat ook wel mooi werkt is als je gebruikers hun eigen subdomein geeft. Dan lock je ze daar gewoon in. Zo kunnen ze geen kant op. Hier onder een voorbeeld van een door mijn php-script gegenereerd subdomein.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##3[ap]
<VirtualHost *:80>
      ServerName   ap.wyger.nl
            <Directory "/usr/ap">
            php_admin_value open_basedir "/usr/ap"
            php_admin_value safe_mode 1
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
      DocumentRoot "/usr/ap"
      ServerAlias  ap.wyger.nl
      UseCanonicalName Off
      ServerAdmin  "info@ap-jachthut.tk"
</VirtualHost>
##3[/ap]

[ Voor 8% gewijzigd door LoBbY_1 op 28-09-2004 23:00 . Reden: typo ]

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 16-08 20:53
Shit, krijg nou wat .. (toch niet)
Ik heb helemaal niet gedacht aan het idee om met apache per vhost een gebruiker te locken op z'n eigen stukje.
Ik maak gebruik van mod_vhost_alias, dat maakt het alleen wel een stuk lastiger. Eigenlijk ben ik nog steeds opzoek naar een oplossing met MYSQL en daarin de vhosts en eventuele configuratie opties, zodat ik met een php script gemakkelijk wat kan toevoegen. Jouw script voegt iets toe aan je httpd.conf (of hoe je het ook hebt genoemd), dan kun je achteraf helaas niet meer makkelijk iets verwijderen.

Ik kan de include dir niet op de web dir zetten, dan zouden andere gebruikers namelijk bij elkaar bestanden kunnen includen. Zoals een bestand met database passwords enzo, wat toch wel vervelend zou zijn.

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 18-07 21:03
Dat is wel het gene dat ik heb :) Hij genereerd alle gebruikers uit een database. Die kan je dus ook verwijderen. De apache server start om de 2 uur opnieuw op, en 5 minuten voor die 2 uur word de lijst opnieuw gegenereerd. Dus je kan ook heel makkelijk gebruikes weggooien. Ik heb ze niet in de httpd.conf staan, maar in een ander bestand die je include in de httpd.conf.

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 16-08 20:53
LoBbY_1 schreef op 29 september 2004 @ 18:18:
Dat is wel het gene dat ik heb :) Hij genereerd alle gebruikers uit een database. Die kan je dus ook verwijderen. De apache server start om de 2 uur opnieuw op, en 5 minuten voor die 2 uur word de lijst opnieuw gegenereerd. Dus je kan ook heel makkelijk gebruikes weggooien. Ik heb ze niet in de httpd.conf staan, maar in een ander bestand die je include in de httpd.conf.
MM, dat restart plan is zo slecht nog niet, als het goed is vervallen er geeneens verbindingen daardoor. Een manual restart kan ik dan ook nog doen.

Wil je het script hier plaatsen? Ik kan dit ook nog mooi gebruiken voor een andere tool, dan heb ik alvast een beginnetje :)

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 18-07 21:03
Ok hier heb ik een voorbeeld van hoe je een subdomeinen configuratie kan maken. Ik neem aan dat je zelf wel een redelijk gebruikers management kan maken :)

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?
  //vhosts genereren uit de databees
  //includes
  include("../inc/instellingen.inc.php");
  include("../inc/dbconnect.inc.php");
  
  echo "bezig met genereren van vhosts.....\n";
  $i = 0;
  
  $sites = mysql_query("select * from users") or die (mysql_error());
  while ($inh_sites = mysql_fetch_array($sites))
  {
      $naam  = $inh_sites[naam];
      $email = $inh_sites[email];

      //spaties uit de gebruikersnaam halen...
      [..
      Wat cheks op rare tekens... en spaties enz
       ..]

      $pad   = "/usr/".$naam;
      $i++;
      
      //data genereren
      $data .= ('
      
##'.$i.'['.$naam.']
<VirtualHost *:80>
      ServerName   '.$naam.'.wyger.nl
            <Directory "'.$pad.'">
            php_admin_value open_basedir "'.$pad.'"
            php_admin_value safe_mode 1
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
      DocumentRoot "'.$pad.'"
      ServerAlias  '.$naam.'.wyger.nl
      UseCanonicalName Off
      ServerAdmin  "'.$email.'"
</VirtualHost>
##'.$i.'[/'.$naam.'] ');

  }
  mysql_free_result($sites);

  echo "Lijst gegenereerd...bezig met schrijven naar vhosts.tmp...\n";
 //nieuwe configuratie bestand schrijven
    $fp = fopen("tmp/vhosts.tmp", "w");
    fwrite($fp, $data);
    fclose($fp);
    
  echo "Bestand geschreven....";

?>


Voordat ik de vhosts.tmp laat copieren word er eerst een backup gemaakt van de vorige configuratie. Daarna word deze pas gekopieerd naar de plaats waar je je vhost configuratie wilt laden

Dit script staat ook niet in de website zelf, maar daarbuiten. Aanroepen kan je dan doen met een taak planner of een cronjob. Dan gewoon laten openen met "php bestand.php"

[ Voor 21% gewijzigd door LoBbY_1 op 15-11-2004 10:42 ]

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 16-08 20:53
LoBbY_1 schreef op 03 oktober 2004 @ 13:10:
Ok hier heb ik een voorbeeld van hoe je een subdomeinen configuratie kan maken. Ik neem aan dat je zelf wel een redelijk gebruikers management kan maken :)

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?
  //vhosts genereren uit de databees
  //includes
  include("../inc/instellingen.inc.php");
  include("../inc/dbconnect.inc.php");
  
  echo "bezig met genereren van vhosts.....<br>";
  $i = 0;
  
  $sites = mysql_query("select * from users") or die (mysql_error());
  while ($inh_sites = mysql_fetch_array($sites))
  {
      $naam  = $inh_sites[naam];
      $email = $inh_sites[email];

      //spaties uit de gebruikersnaam halen...
      [..
      Wat cheks op rare tekens... en spaties enz
       ..]

      $pad   = "/usr/".$naam;
      $i++;
      
      //data genereren
      $data .= ('
      
##'.$i.'['.$naam.']
<VirtualHost *:80>
      ServerName   '.$naam.'.wyger.nl
            <Directory "'.$pad.'">
            php_admin_value open_basedir "'.$pad.'"
            php_admin_value safe_mode 1
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
      DocumentRoot "'.$pad.'"
      ServerAlias  '.$naam.'.wyger.nl
      UseCanonicalName Off
      ServerAdmin  "'.$email.'"
</VirtualHost>
##'.$i.'[/'.$naam.'] ');

  }
  mysql_free_result($sites);

  echo "Lijst gegenereerd...bezig met schrijven naar vhosts.tmp...\n";
 //nieuwe configuratie bestand schrijven
    $fp = fopen("tmp/vhosts.tmp", "w");
    fwrite($fp, $data);
    fclose($fp);
    
  echo "Bestand geschreven....";

?>


Voordat ik de vhosts.tmp laat copieren word er eerst een backup gemaakt van de vorige configuratie. Daarna word deze pas gekopieerd naar de plaats waar je je vhost configuratie wilt laden

Dit script staat ook niet in de website zelf, maar daarbuiten. Aanroepen kan je dan doen met een taak planner of een cronjob. Dan gewoon laten openen met "php bestand.php"
Nog bedankt voor je script. Ik wil op die manier een BNC (Bouncer voor IRC) ook gaan automatiseren :)
Eigenlijk heel simpel script, ik dacht dat het schrijven van een file nog lastiger ging als dat fwrite enzo :)

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)

Pagina: 1