CGIWrapa ciąg dalszy – spersonalizowane php.ini

W poprzednim artykule nauczyliśmy się uruchamiać PHP z prawami użytkownika wykorzystując CGIWrap. W tym krótkim opisie, pokażę jak można dodatkowo spersonalizować php.ini dla każdego użytkownika, by zapewnić jemu jak najlepszą obsługę, ale również nie narażać swojego systemu na niepotrzebne ryzyko.

Trochę witaminy C nikomu nie zaszkodziło

Typową metodą by uzyskać spersonalizowane php.ini jest wyeksportowanie w jakiś sposób zmiennej środowiskowej PHPRC. W przypadku mod_php za pomocą SetEnv, w przypadku rewritów częstym sposobem jest definiowanie zmiennej w samym rewricie za pomocą E=PHPRC:${dir2owner:${…}} gdzie dir2owner jest RewriteMapą typu ‘prg’, która mapuje właściciela wykonywanego skryptu lub katalogu w którym znajduje się skrypt. Aż w końcu w przypadku cgi/fastcgi jest dodanie do wrappera shellowego odpowiedniej definicji export.


W przypadku CGIWrapa najlepszą metodą będzie po prostu wyeksportowanie PHPRC w samym kodzie CGIWrapa. Do tego celu sporządziłem następującego patcha:

--- fetch.c	2009-10-13 03:28:00.734065077 +0200
+++ fetch.c-new	2009-10-13 03:28:17.407378494 +0200
@@ -30,10 +30,13 @@
 	char *pathInfoString;
 	char *queryString;
 	char *userStr;
+	char *phprc;
+	char *phpdir;
 
 	DEBUG_Msg("\n");
 
 	userStr = (char *) 0;
+	phpdir = "/etc/php/users.d/";
 	//pathInfoString = getenv("PATH_INFO");
 	pathInfoString = getenv("PATH_TRANSLATED");
 	if ( pathInfoString )  /* use PATH_INFO */
@@ -44,6 +47,11 @@
 			DEBUG_Msg("Trying to extract user from PATH_TRANSLATED.");
 
 			userStr = GetPathComponent(1, pathInfoString);
+			phprc = (char *)malloc((strlen(phpdir) + strlen(userStr) + 1) *sizeof(char));
+			strcpy (phprc , phpdir);
+			strcat (phprc , userStr);
+			setenv("PHPRC", phprc, 1);
+			DEBUG_Str("Setting PHPRC to ", phprc);
 		}
 		else
 		{

(patch do ściągnięcia stąd)

Definiujemy sobie w ten sposób katalog w którym PHP będzie się spodziewać plików php.ini dla użytkowników (w tym przypadku jest to katalog /etc/php/users.d/$USER/, gdzie $USER to użytkownik systemu). Katalog można ustawić w zmiennej “phpdir” w patchu.

Z tą poprawką nie musimy już nic więcej przekazywać serwerowi Apache. Wystarczy podmienić poprawioną binarkę CGIWrapa i bez restartu Apache, cieszyć się spersonalizowanymi php.ini.

Użytkowników PLD-Linux ucieszy być może fakt, że patch jest już częścią dystrybucyjnego CGIWrapa od release 5.

Bijcie!

5 Comments

Leave a Reply