Wie sicher die meisten Syscp Benutzer von euch wissen, hängt Syscp immer ein abschließendes Slash an die für open_basedir angegebenen Verzeichnisse an. Da dieses Verhalten nicht immer gewünscht ist habe ich mir jetzt einmal die Codestellen in Syscp gesucht und abgeändert.
[infobox]Bitte unbedingt ein Backup der betroffenen Dateien und der Syscp Datenbank machen![/infobox]
Zu beachten ist auch, dass bei einem Update von Syscp alle Änderungen vllt. neu durchgeführt werden müssen, je nachdem welche Dateien bei einem Update betroffen sind. Ich übernehme keine Garantie für die Korrektheit der Änderungen, der Einbau erfolgt auf eigene Gefahr. Alle Änderungen wurden auf einem Standard-Netcup-Debian System getestet mit Syscp Version 1.4.2. So wie ich das sehe sollten die Änderungen aber auch bei älteren Syscp Versionen funktionieren, bei neuen eher nicht.
In der /var/www/syscp/lib/functions.php gibt es folgende Funktion:
function makeCorrectDir($dir)
{
if(substr($dir, -1, 1) != '/')
{
$dir.= '/';
}
if(substr($dir, 0, 1) != '/')
{
$dir = '/' . $dir;
}
$dir = makeSecurePath($dir);
return $dir;
}
Alles anzeigen
Diese Funktion ist für die ungewollten Pfadangaben verantwortlich. Da diese Funktion in Syscp an mehreren Stellen verwendet wird, wo Slash's am Ende doch erfoderlich sind, statten wir die Funktion mit einem neuen Parameter aus, den wir bei Bedarf dann überall einsetzen können:
function makeCorrectDir($dir, $append = true)
{
if($append && substr($dir, -1, 1) != '/')
{
$dir.= '/';
}
elseif(!$append && substr($dir, -1, 1) == '/')
{
$dir = substr($dir, 0, (strlen($dir) - 1));
}
if(substr($dir, 0, 1) != '/')
{
$dir = '/' . $dir;
}
$dir = makeSecurePath($dir);
return $dir;
}
Alles anzeigen
Nun öffnen wir noch die /var/www/syscp/admin_settings.php und suchen folgenden Code:
$value = validate($_POST['system_phpappendopenbasedir'], 'phpappendopenbasedir');
$value = explode(':', $value);
foreach($value as $number => $path)
{
$value[$number] = makeCorrectDir($path);
}
Den ersetzen wir mit folgendem Code:
$value = validate($_POST['system_phpappendopenbasedir'], 'phpappendopenbasedir');
$value = explode(':', $value);
foreach($value as $number => $path)
{
$value[$number] = makeCorrectDir($path, false);
}
Das selbe kann man natürlich auch für andere Einstellungen machen, bei denen man die Pfade wirklich selbst angeben möchte, wirklich sinnvoll ist es aber nur beim open_basedir. Davon unberührt bleibt übrigens das Webverzeichnis des Benutzers (z.B: /var/kunden/webs/kunde1/), diese Pfade werden trotzdem noch mit Slash angegeben. Falls man das auch ändern möchte, muss man noch folgende zwei Änderungen durchführen:
Suche in /var/www/syscp/scripts/cron_tasks.inc.http.10.apache.php:
if($domain['openbasedir_path'] == '1')
{
$php_options_text.= ' php_admin_value open_basedir "' . $domain['customerroot'] . $_phpappendopenbasedir . "\"\n";
}
else
{
$php_options_text.= ' php_admin_value open_basedir "' . $domain['documentroot'] . $_phpappendopenbasedir . "\"\n";
}
Ersetze es mit:
if($domain['openbasedir_path'] == '1')
{
$php_options_text.= ' php_admin_value open_basedir "' . makeCorrectDir($domain['customerroot'], false) . $_phpappendopenbasedir . "\"\n";
}
else
{
$php_options_text.= ' php_admin_value open_basedir "' . makeCorrectDir($domain['documentroot'], false) . $_phpappendopenbasedir . "\"\n";
}
Suche in /var/www/syscp/scripts/cron_tasks.inc.http.15.apache_fcgid.php:
if($domain['openbasedir_path'] == '0')
{
$openbasedir = $domain['documentroot'] . ':' . $tmpdir . ':' . $this->settings['system']['mod_fcgid_peardir'] . ':' . $this->settings['system']['phpappendopenbasedir'];
}
else
{
$openbasedir = $domain['customerroot'] . ':' . $tmpdir . ':' . $this->settings['system']['mod_fcgid_peardir'] . ':' . $this->settings['system']['phpappendopenbasedir'];
}
Ersetze es mit:
if($domain['openbasedir_path'] == '0')
{
$openbasedir = makeCorrectDir($domain['documentroot'], false) . ':' . makeCorrectDir($tmpdir, false) . ':' . makeCorrectDir($this->settings['system']['mod_fcgid_peardir'], false) . ':' . $this->settings['system']['phpappendopenbasedir'];
}
else
{
$openbasedir = makeCorrectDir($domain['customerroot'], false) . ':' . makeCorrectDir($tmpdir, false) . ':' . makeCorrectDir($this->settings['system']['mod_fcgid_peardir'], false) . ':' . $this->settings['system']['phpappendopenbasedir'];
}
Falls jemand damit Probleme hat, bitte einfach auf dieses Thema antworten
Über Feedback und/oder Verbesserungsvorschläge würde ich mich freuen
MfG Christian