2009-05-07 2 views
0

Что-то здесь несовместимо с PHP5, но я полностью потерял то, что. У меня есть файл .htaccess на моем веб-сервере, который имеет строку «AddHandler x-mapp-php5 .php», так как это требуется почти всем остальным на сервере, и по умолчанию используется PHP4 ... однако; Мне нужен этот один скрипт для работы, но он только работает на PHP4. Любая идея, где проблема?Охота на несовместимость PHP5

<? 
/* config for the script */ 
$download_path = "content"; /* path to your files, NB: no slash at the end */ 
$sort = "asort"; /* array sorting - alphabetical sorting for the array */ 

/* start the script... no more editing from here on... */ 

/* get a list of the files + dirs and turn the list into an array */ 
function file_list($dir) { 
    global $sort; 
    global $file_file_count; 
    if (is_dir($dir)) { 
    $fd = @opendir($dir); 
    while (($part = @readdir($fd)) == true) { 
     clearstatcache(); 
     if ($part != "." && $part != "..") { 
     $file_array[] = $part; 
     } 
    } 
    if ($fd == true) { 
    closedir($fd); 
    } 
    if (is_array($file_array)) { 
    $sort($file_array); 
    $file_file_count = count($file_array); 
    return $file_array; 
    } else { 
    return false; 
    } 
    } else { 
    return false; 
    } 
} 

/* function to convert to Mb, Kb and bytes */ 
function file_size($size) { 
    $megabyte = 1024 * 1024; 
    if ($size > $megabyte) { /* literal.float */ 
     $re_sized = sprintf("%01.2f", $size/$megabyte) . " Mb"; 
    } elseif ($size > 1024) { 
     $re_sized = sprintf("%01.2f", $size/1024) . " Kb"; 
    } else { 
     $re_sized = $size . " bytes"; 
    } 
    return $re_sized; 
} 

/* get a list of the files/dirs, put them into a table. */ 
function generate_file_list($path) { 
    global $download_path; 
    global $PHP_SELF; 
    $final_path = str_replace("//","/",str_replace("..","",urldecode($path))); 
    $file_array = file_list("$download_path/$final_path/"); 
    echo "<b>$final_path/</b>\n"; 
    echo "<br><br>\n\n"; 
    if ($file_array == false) { /* check if the dir is an array before we process it to foreach(); */ 
    echo "directory empty\n"; 
    } else { 
    echo "<table width=\"75%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"; 
    echo "<tr><td><b>file</b></td><td><b>size</b></td></tr>\n"; 
    foreach ($file_array as $file_name) { 
     $is_file = "$download_path/$final_path/$file_name"; 
     $final_dir_name = urlencode($final_path); /* urlencode(); to prevent any broken links - decode on do_download(); */ 
     $final_file_name = urlencode($file_name); 
     $file_size = filesize("$download_path/$final_path/$file_name"); 
     $final_file_size = file_size($file_size); 
     if (is_file($is_file)) { 
     print "<tr><td><a href=\"$PHP_SELF?go=download&path=$final_dir_name&file=$final_file_name\">$file_name</a></td><td>$final_file_size</td></tr>\n"; 
     } elseif (is_dir($is_file)) { 
     print "<tr><td><a href=\"$PHP_SELF?go=list&path=$final_dir_name/$final_file_name\">$file_name/</a></td><td>&lt;dir&gt;</td></tr>\n"; /* we don't need a size for a directory */ 
     } 
    } 
    echo "</table>\n"; 
    } 
} 
/* allow the user to download the file... */ 
function do_download($path,$file) { 
    global $download_path; 
    $get_path = str_replace("//","/",str_replace("..","",stripslashes(urldecode($path)))); /* fopen adds \ to ' - so we strip 'em. */ 
    $get_file = str_replace("//","/",str_replace("..","",stripslashes(urldecode($file)))); 
    header("Content-Disposition: atachment; filename=$get_file"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Length: ".filesize("$download_path/$get_path/$get_file")); 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    $fp = fopen("$download_path/$get_path/$get_file","r"); 
    print fread($fp,filesize("$download_path/$get_path/$get_file")); 
    fclose($fp); 
    exit; 
} 

if (!isset($go)) { 
    $go = "dirlist"; 
} if ($go == "dirlist") { 
    generate_file_list(""); /* null, so we get a list for the root directory */ 
    } elseif ($go == "list" && isset($path)) { 
    if (isset($path)) { /* if the path is null - it returns a list for the root directory */ 
     generate_file_list($path); /* get a list for the path specified */ 
    } else { 
     generate_file_list(""); 
    } 
    } elseif ($go == "download") { 
     if (isset($path) && isset($file)) { 
     do_download($path,$file); /* download the file... */ 
     } else { 
    echo "no file selected to download :)\n"; 
    } 
} 
?> 

ответ

1

Код в предположении, что $ идти, файла $ и $ путь переменные быть магическим образом установлены. Чтобы обойти эту проблему (и исправить сценарий), вы могли бы изменить начало сценария выглядеть следующим образом:

<? 
/* config for the script */ 
$download_path = 'content'; /*path to your files, NB: no slash at the end*/ 
$sort = 'asort'; /* array sorting - alphabetical sorting for the array */ 

/* start the script... no more editing from here on... */ 
$go = $_REQUEST['go']; 
$file = $_REQUEST['file']; 
$path = $_REQUEST['path']; 

// ... 

Это использование работать на вас из-за чего-то известного как Register Globals. Теперь это отключено, так как это была довольно большая проблема безопасности, и это привело к небрежным правилам кодирования.

+0

Почти есть IsSet звонки в там. Вы хотите сделать if (isset ($ _ REQUEST ['go'])) {$ go = $ _REQUEST ['go'];}, чтобы убедиться, что более поздний код по-прежнему работает. – jmucchiello

+0

Это не обязательно. Если для них нет значений, то они будут установлены в нуль. Null вычисляет false в isset(). –

+0

Удивительно, это сработало отлично. На самом деле это какой-то старый код, который я когда-то собирал, и просто выгрузил его на локальный сервер для тестирования - безопасность неважно, поскольку сервер открыт только для локальной сети. –

2

Когда вы исправили проблему с регистрами Globals, предложенную fiXedd и jmucchiello, убедитесь, что вы удалили ссылку на $ PHP_SELF в функции generate_file_list. Во-первых, он больше не существует: теперь это $ _SERVER ['PHP_SELF'], но что более важно, то, как использует ваш скрипт, подвергает вас проблеме межсайтового скриптинга.

Подробнее об этом на: http://www.seancoates.com/xss-woes

+0

Хороший улов, я полностью пропустил это. :) –

+0

Да, я исправил их в своей продолжающейся несовместимости после публикации этой темы, хотя это было несколько не нужно, поскольку это только локальный сервер ... поэтому, если я не планирую взломать себя, я думаю, что все будет хорошо. : O Этот код довольно древний, поэтому я предполагаю, что это должно быть довольно ужасно. Он работает для того, что мне нужно, хотя я действительно не хотел тратить время на его переписывание. –

Смежные вопросы