Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: php.ini
 
 автор: Gandzas   (23.10.2006 в 12:23)   письмо автору
 
 

У меня в индексе прописан скрипт:


<?php
    
if(!@$p$p="cat";
    if(
eregi("(\.)",$p)) exit("не шали");
    require(
"files/".$p.".php");
?>


Что нужно изменить в php.ini, чтобы отображались страницы вида
http://mysite.ru/index.php?p=какой-то файл?

   
 
 автор: cheops   (23.10.2006 в 12:51)   письмо автору
 
   для: Gandzas   (23.10.2006 в 12:23)
 

>Что нужно изменить в php.ini, чтобы отображались страницы вида
>http://mysite.ru/index.php?p=какой-то файл?
Не очень понятно, что имеется ввиду, конструкция "files/".$p.".php" не позволит в начало поставить подстроку http://, следует просто передавать $p конструкции require().

PS Инструкции require(), include() с динамическими путями (особенно сетевыми) не рекомендуется применять для публичных сетевых проектов - это уязвимость, позволяющая злоумышленику выполнять любой произвольный PHP-код на вашем сайте.

   
 
 автор: Gandzas   (23.10.2006 в 12:57)   письмо автору
 
   для: cheops   (23.10.2006 в 12:51)
 

files - это папка, в которой лежат файлы. сам index лежит выше этой папки.
Я не совсем понимаю, каким образом это работает, но работает, вопрос в том, что страница
http://mysite.ru/index.php?p=сат (главная) работает, а при переходе на http://mysite.ru/index.php?p=cat1 (например), все-равно отображается cat .
На другом ресурсе это исправлялось в php.ini
Вот я и хочу узнать, что именно исправлялось.

   
 
 автор: Trianon   (23.10.2006 в 12:58)   письмо автору
 
   для: Gandzas   (23.10.2006 в 12:23)
 

это надо делать не в PHP.INI а в самом index.php

<?php 
    
if(isset($_GET['p']) $p $_GET['p'];
    else 
$p="cat"
    if(
eregi("(\.)",$p)) exit("не шали"); 
    require(
"files/".$p.".php"); 
?> 

Но вообще Вы с огнем играете. Позволять подключать пользователю какие-угодно файлы, пусть даже в пределах некоторого каталога - довольно рискованный шаг.

   
 
 автор: Gandzas   (23.10.2006 в 13:03)   письмо автору
 
   для: Trianon   (23.10.2006 в 12:58)
 

Это шаблон, который я взяла у человека,8 лет пишушего на php.....

в индексе прописана шапка и низ страницы, а в середине вставлен именно этот скрипт, без гета.
Я хочу понять, КАК это работает. Но, для того, чтобы все отображалось корректно, он что-то менял в php.ini
И, честно говоря, не думаю, что он не учел безопасность... Потому, как какой бы файл я не пыталась подключить, выводится - не шали))
Может, я чего-то не понимаю?

   
 
 автор: cheops   (23.10.2006 в 13:09)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:03)
 

Мог и не учесть, префикс "files" отпугнёт злоумышленика-новичка, но обойти его тоже можно при помощи нулевого символа.

Т.е. у вас не грузиться файл files/cat1.php? Попробуйте перед инструкцией require("files/".$p.".php"); вывести путь
<?php
echo "files/".$p.".php<br>";
?>

Что выводится (возможно имеется ввиду директива register_globals)?

   
 
 автор: Gandzas   (23.10.2006 в 13:15)   письмо автору
 
   для: cheops   (23.10.2006 в 13:09)
 

путь к файлу я прописываю <a href='index.php?p=файл_который_нужен'>Файл который нужен</a>
Без директории files.

>>>Попробуйте перед инструкцией require("files/".$p.".php"); вывести путь

Сейчас попробую

   
 
 автор: Gandzas   (23.10.2006 в 13:17)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:15)
 

Ответ:
files/cat.php

   
 
 автор: cheops   (23.10.2006 в 13:26)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:17)
 

Попробуйте вариант Trianona - если он работает, то у вас в php.ini отключена директива register_globals, её следует либо включить
register_globals = on

а ещё лучше использовать суперглобальный массив $_GET, как показал Trianon, так как в PHP 6 включить директиву register_globals скорее всего уже не удасться и всё равно придётся весь код переписывать с использованием суперглобальных массивов.

   
 
 автор: Gandzas   (23.10.2006 в 13:25)   письмо автору
 
   для: cheops   (23.10.2006 в 13:09)
 

>>>Что выводится (возможно имеется ввиду директива register_globals)?
Значение этой директивы =On (в исправленном файле)
Возможно именно в ней и вопрос?
Тогда получается, что действительно это небезопасно?
А как тогда решить этот вопрос? Чтобы в каждом файле не прописывать шапку?

<?php require("шапка.php"); ?> Так???

   
 
 автор: cheops   (23.10.2006 в 13:29)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:25)
 

><?php require("шапка.php"); ?> Так???
Да, обычно именно так и поступают.

   
 
 автор: Gandzas   (23.10.2006 в 13:31)   письмо автору
 
   для: cheops   (23.10.2006 в 13:29)
 

Так какой вариант лучше?
<?php require("шапка.php"); ?>
или

<?php
$p = $_GET['p'];

if(!@$p) $p="cat";
if(eregi("(\.)",$p)) exit("не шали");
require("files/".$p.".php");
?>

   
 
 автор: cheops   (23.10.2006 в 13:40)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:31)
 

Если работает, то лучше :))) (однако вероятность взлома всё равно остаётся, у вас $p какие значения может принимать? Только цифры и буквы?).

   
 
 автор: Gandzas   (23.10.2006 в 13:43)   письмо автору
 
   для: cheops   (23.10.2006 в 13:40)
 

Да. Вообще файлы стараюсь обзывать только буквами

   
 
 автор: cheops   (23.10.2006 в 13:47)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:43)
 

Тогда вместо
<?php
if(eregi("(\.)",$p)) exit("не шали");
?>

можно использовать следующую проверку
<?php
if(preg_match("|[^\0-9a-z]|i",$p)) exit("не шали");
?>

она не пропустит ничего кроме цифр и букв. В принципе отсутствие точки тоже не даёт практически никаких шансов для манёвра злоумышленика, но так спокойнее :)))

   
 
 автор: Gandzas   (23.10.2006 в 13:56)   письмо автору
 
   для: cheops   (23.10.2006 в 13:47)
 

Спасибо. :)

   
 
 автор: Gandzas   (23.10.2006 в 15:05)   письмо автору
 
   для: Gandzas   (23.10.2006 в 13:56)
 

Учитывая Вашу помощь, появился код:


<?
    $p_values 
= array();
    
$count_files 0;

    if (
$handle opendir('files')) {
        while (
false !== ($file readdir($handle))) { 
            if (
$file != "." && $file != "..") { 
                
$p_values[$count_files] = trim(str_replace('.php'''$file));
                
$count_files++;
            } 
        }
        
closedir($handle); 
    }

    
$p = (isset($_GET['p'])) ? strtolower($_GET['p']) : 'cat';
    if (
in_array($p$p_values)) {
        require(
'files/'.$p.'.php');
    } else {
        die(
'No access');
    }
?>


Сюда можно что-то еще добавить?

   
 
 автор: Trianon   (23.10.2006 в 15:20)   письмо автору
 
   для: Gandzas   (23.10.2006 в 15:05)
 

Строку

if ($file != "." && $file != "..") {  

имеет смысл поменять на

if (is_file("files/$file")) {  


Кроме того, если пользователь тем или иным образом сможет загрузить в каталог files собственный файл, опасность выполнения произвольного кода всё еще остается.

   
 
 автор: Gandzas   (23.10.2006 в 17:16)   письмо автору
 
   для: Trianon   (23.10.2006 в 15:20)
 

Спасибо.

А в чем разница?

Сможеть, если получит админский доступ.
Но в этом случае, говорить можно о взломе любого сайта :))

   
 
 автор: Gandzas   (23.10.2006 в 17:21)   письмо автору
 
   для: Gandzas   (23.10.2006 в 17:16)
 

кроме того в случае с поименным перечислениям всегла можно добавить какое-то конкретное имя файла типа if ($file != "." && $file != ".." && $file != ".htaccess" && $file != "index.html") { и так далее

   
 
 автор: cheops   (23.10.2006 в 22:54)   письмо автору
 
   для: Gandzas   (23.10.2006 в 17:16)
 

. - это текущая директория,
.. - это родительская директория
т.е. все остальные директории отличные от этих проходят, is_file() - проверяет является ли текущая позиция файлом.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования