Bestand op de webserver schrijfbaar maken
Hetzelfde als in het leesbaar-artikel geldt voor het schrijfbaar zijn; veel hangt af van de organisatie van de server, de webserver, de gebruikers-accounts. Op je eigen servers kan je altijd naar root gaan om aanpassingen te doen, bij extern gehoste servers natuurlijk niet.
In principe zijn webpagina’s alleen leesbaar, en zou niets schrijfbaar moeten zijn, behalve voor de ingelogde gebruiker. Die kan beslissen bestanden te overschrijven, bv om een upgrade te doen.
Maar als de php-toepassing zelf een bestand moeten schrijven, dan moet dat bestand schrijfbaar zijn voor de webserver.
Enkele vb situaties:
- gebruiker en server in zelfde groep
- niet in zelfde groep (world writeable)
- hostingprovider.
1. groep
Op deze server zit de webserver in dezelfde groep als mijn gebruiker, en ik verander de groepsrechten:
chmod g+w schrijfbaarbestand.htm
Als je niet weet met welke naam een bestand of meer bestanden geschreven gaan worden, kan je verplicht zijn een hele directory schrijfbaar te maken (bv een cache directory voor de php toepassing). Als je alle ingesloten bestanden ineens mee schrijfbaar wil maken kan dat met een parameter voor recursieve bewerking “-R”, bv:
chmod -R g+w ./cache
Dat kan je uittesten met een eenvoudige test php pagina die een bestand schrijft (zie*).
De foutmelding geeft aan wat verandert moet worden:
Warning: fopen(./../write/geschreven.txt) [function.fopen]: failed to open stream: No such file or directory in /srv/www/htdocs/test/rechten/schrijfhtml.php on line 4
fout bij zever schrijven
(de write directory bestaat nog niet)
cd ..
mkdir write
ls -ld ./write
drwxr-xr-x 2 pinguim users 48 2007-05-07 14:11 ./write
chmod -R g+w ./write/
ls -ld ./write
drwxrwxr-x 2 pinguim users 48 2007-05-07 14:11 ./write
2. world writeable
Of als webserver niet in zefde groep zit moet je misschien “others” schrijfrecht geven, (wat minder ideaal is):
chmod -R o+w ./write/
ls -ld ./write
drwxrwxrwx 2 pinguim users 48 2007-05-07 14:11 ./write
verder algemeen:
Nu kan je ook zien wie de gebruiker is die het tekstbestand geschreven heeft:
ls -lF ./write/*
-rw-r–r– 1 wwwrun www 21 2007-05-07 16:05 ./write/geschreven.txt
Op dit systeem is dat dus de wwwrun gebruiker, waaronder de webserver draait.
Ik kan als gebruiker nu het bestand wel lezen (r), maar niet wijzigen. Kan ik mezelf die rechten geven met chmod?
cd write
chmod g+w geschreven.txt
chmod: changing permissions of `geschreven.txt’: Operation not permitted
Kan ik het bestand “overnemen”, mezelf er eigenaar van maken?
chown pinguim geschreven.txt
chown: changing ownership of `geschreven.txt’: Operation not permitted
Als ik mezelf root maak gaat het natuurlijk wel.
3. hosting
Op een andere (gehuurde) host werkt het wel eenvoudiger (misschien via het sticky bit?); ik zet laat het schrijfhtml.php bestand een tekst maken en die heeft deze eigenschappen:
-rw-r–r– 1 pinguim webusers 21 May 7 16:33 geschreven.txt
en kan ik met mijn login gewoon tekst aan het bestand toevoegen (of verwijderen, ..):
echo "zever in pakskes" >>geschreven.txt
cat geschreven.txt
rm geschreven.txt
De php code schijnt hier met dezelfde gebruiker te werken als mijn login, want de groep en other hebben geen schrijfrechten.
Als ik echter de other leesrechten afneem, kan de webserver het bestand niet meer weergeven:
chmod o-r geschreven.txt
Geeft “Forbidden” in de browser.
De testpagina
Test pagina “schrijven vanuit php” (uitpakken en op webserver zetten) : downloaden met rechts-klik.
Voor het test-gemak schrijft het telkens bij in de tekst. Verwijder dit php bestand na de test want telkens het opgeroepen wordt via het web maakt het de test tekst langer!!