Datum: 06.04.2010
, Kategorie:
PHP
Seit einiger Zeit setzt sich bei Webspace-Providern immer mehr die Unart durch, die Änderung des include_path zu unterbinden. Man verspricht sich davon einen Sicherheitsgewinn. Wo der liegen soll, ist allerdings fraglich. Wozu ist denn bitteschön open_basedir da?
Egal. Da die wenigsten Provider mit sich reden lassen, müssen wir notgedrungen unsere Scripte anpassen. Die Änderung der Pfade im eigenen Code ist eine zum Teil recht mühselige, aber zumindest einmalige Angelegenheit. Bei Code-Bibliotheken wie PEAR ist das schon aufwändiger. Zu einer hohen Zahl an Dateien kommen noch mehr oder minder regelmäßige Updates. Also muss das Ändern der Pfade automatisiert werden. Und genau dies tut folgendes Script. Einfach eine Datei namens libpaths.php erstellen und im obersten Bibliotheksverzeichnis speichern und ausführen.
<?php
$paths = array('.');
while (list($key, $val) = each($paths))
{
if (!is_dir($val)) {
continue;
}
if ($handle = opendir($val)) {
while (false !== ($file = readdir($handle)))
{
if (strpos($file, '.') === 0) {
continue;
}
if (strpos($file, 'libpaths.php') !== false) {
continue;
}
$level = 0;
if (!is_dir($val . '/' . $file)) {
$level = substr_count($val . '/' . $file, '/') - 1;
}
$paths[] = $val . '/' . $file;
if (is_dir($val . '/' . $file)) {
continue;
}
$search = array(
'require_once '',
'require_once "',
'require_once('',
'require_once("',
'require_once ('',
'require_once ("',
'include_once '',
'include_once "',
'include_once('',
'include_once("',
'include_once ('',
'include_once ("',
'include_once($',
'include '',
'include "',
'include('',
'include("',
'include ('',
'include ("',
'MDB2::fileExists($file_name))'
);
$levels = str_repeat('../', $level);
$replace = array(
'require_once dirname(__FILE__) . '/' . $levels . '' . '',
'require_once dirname(__FILE__) . '/' . $levels . '' . "',
'require_once(dirname(__FILE__) . '/' . $levels . '' . '',
'require_once(dirname(__FILE__) . '/' . $levels . '' . "',
'require_once (dirname(__FILE__) . '/' . $levels . '' . '',
'require_once (dirname(__FILE__) . '/' . $levels . '' . "',
'include_once dirname(__FILE__) . '/' . $levels . '' . '',
'include_once dirname(__FILE__) . '/' . $levels . '' . "',
'include_once(dirname(__FILE__) . '/' . $levels . '' . '',
'include_once(dirname(__FILE__) . '/' . $levels . '' . "',
'include_once (dirname(__FILE__) . '/' . $levels . '' . '',
'include_once (dirname(__FILE__) . '/' . $levels . '' . "',
'include_once(dirname(__FILE__) . '/' . $levels . '' . $',
'include dirname(__FILE__) . '/' . $levels . '' . '',
'include dirname(__FILE__) . '/' . $levels . '' . "',
'include(dirname(__FILE__) . '/' . $levels . '' . '',
'include(dirname(__FILE__) . '/' . $levels . '' . "',
'include (dirname(__FILE__) . '/' . $levels . '' . '',
'include (dirname(__FILE__) . '/' . $levels . '' . "',
'MDB2::fileExists(dirname(__FILE__) . '/' . $levels . '' . $file_name))'
);
$content = file_get_contents($val . '/' . $file);
$content = str_replace($search, $replace, $content);
file_put_contents($val . '/' . $file, $content);
echo nl2br("$val/$filen");
}
closedir($handle);
}
}
Wer MDB2 verwendet, muss folgende Funktion in MDB2.php manuell anpassen:
function fileExists($file)
{
// safe_mode does notwork with is_readable()
if (!@ini_get('safe_mode')) {
$dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach ($dirs as $dir) {
if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
return true;
}
}
} else {
$fp = @fopen($file, 'r', true);
if (is_resource($fp)) {
@fclose($fp);
return true;
}
}
return false;
}
Die else-Bedingung muss weg.
function fileExists($file)
{
// safe_mode does notwork with is_readable()
if (!@ini_get('safe_mode')) {
$dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach ($dirs as $dir) {
if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
return true;
}
}
}
$fp = @fopen($file, 'r', true);
if (is_resource($fp)) {
@fclose($fp);
return true;
}
return false;
}