|
|
|
| У меня в индексе прописан скрипт:
<?php
if(!@$p) $p="cat";
if(eregi("(\.)",$p)) exit("не шали");
require("files/".$p.".php");
?>
|
Что нужно изменить в php.ini, чтобы отображались страницы вида
http://mysite.ru/index.php?p=какой-то файл? | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 12:23)
| | >Что нужно изменить в php.ini, чтобы отображались страницы вида
>http://mysite.ru/index.php?p=какой-то файл?
Не очень понятно, что имеется ввиду, конструкция "files/".$p.".php" не позволит в начало поставить подстроку http://, следует просто передавать $p конструкции require().
PS Инструкции require(), include() с динамическими путями (особенно сетевыми) не рекомендуется применять для публичных сетевых проектов - это уязвимость, позволяющая злоумышленику выполнять любой произвольный PHP-код на вашем сайте. | |
|
|
|
|
|
|
|
для: cheops
(23.10.2006 в 12:51)
| | files - это папка, в которой лежат файлы. сам index лежит выше этой папки.
Я не совсем понимаю, каким образом это работает, но работает, вопрос в том, что страница
http://mysite.ru/index.php?p=сат (главная) работает, а при переходе на http://mysite.ru/index.php?p=cat1 (например), все-равно отображается cat .
На другом ресурсе это исправлялось в php.ini
Вот я и хочу узнать, что именно исправлялось. | |
|
|
|
|
|
|
|
для: 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");
?>
|
Но вообще Вы с огнем играете. Позволять подключать пользователю какие-угодно файлы, пусть даже в пределах некоторого каталога - довольно рискованный шаг. | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2006 в 12:58)
| | Это шаблон, который я взяла у человека,8 лет пишушего на php.....
в индексе прописана шапка и низ страницы, а в середине вставлен именно этот скрипт, без гета.
Я хочу понять, КАК это работает. Но, для того, чтобы все отображалось корректно, он что-то менял в php.ini
И, честно говоря, не думаю, что он не учел безопасность... Потому, как какой бы файл я не пыталась подключить, выводится - не шали))
Может, я чего-то не понимаю? | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:03)
| | Мог и не учесть, префикс "files" отпугнёт злоумышленика-новичка, но обойти его тоже можно при помощи нулевого символа.
Т.е. у вас не грузиться файл files/cat1.php? Попробуйте перед инструкцией require("files/".$p.".php"); вывести путь
<?php
echo "files/".$p.".php<br>";
?>
|
Что выводится (возможно имеется ввиду директива register_globals)? | |
|
|
|
|
|
|
|
для: cheops
(23.10.2006 в 13:09)
| | путь к файлу я прописываю <a href='index.php?p=файл_который_нужен'>Файл который нужен</a>
Без директории files.
>>>Попробуйте перед инструкцией require("files/".$p.".php"); вывести путь
Сейчас попробую | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:15)
| | Ответ:
files/cat.php | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:17)
| | Попробуйте вариант Trianona - если он работает, то у вас в php.ini отключена директива register_globals, её следует либо включить
а ещё лучше использовать суперглобальный массив $_GET, как показал Trianon, так как в PHP 6 включить директиву register_globals скорее всего уже не удасться и всё равно придётся весь код переписывать с использованием суперглобальных массивов. | |
|
|
|
|
|
|
|
для: cheops
(23.10.2006 в 13:09)
| | >>>Что выводится (возможно имеется ввиду директива register_globals)?
Значение этой директивы =On (в исправленном файле)
Возможно именно в ней и вопрос?
Тогда получается, что действительно это небезопасно?
А как тогда решить этот вопрос? Чтобы в каждом файле не прописывать шапку?
<?php require("шапка.php"); ?> Так??? | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:25)
| | ><?php require("шапка.php"); ?> Так???
Да, обычно именно так и поступают. | |
|
|
|
|
|
|
|
для: 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");
?> | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:31)
| | Если работает, то лучше :))) (однако вероятность взлома всё равно остаётся, у вас $p какие значения может принимать? Только цифры и буквы?). | |
|
|
|
|
|
|
|
для: cheops
(23.10.2006 в 13:40)
| | Да. Вообще файлы стараюсь обзывать только буквами | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 13:43)
| | Тогда вместо
<?php
if(eregi("(\.)",$p)) exit("не шали");
?>
|
можно использовать следующую проверку
<?php
if(preg_match("|[^\0-9a-z]|i",$p)) exit("не шали");
?>
|
она не пропустит ничего кроме цифр и букв. В принципе отсутствие точки тоже не даёт практически никаких шансов для манёвра злоумышленика, но так спокойнее :))) | |
|
|
|
|
|
|
|
для: cheops
(23.10.2006 в 13:47)
| | Спасибо. :) | |
|
|
|
|
|
|
|
для: 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');
}
?>
|
Сюда можно что-то еще добавить? | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 15:05)
| | Строку
if ($file != "." && $file != "..") {
|
имеет смысл поменять на
if (is_file("files/$file")) {
|
Кроме того, если пользователь тем или иным образом сможет загрузить в каталог files собственный файл, опасность выполнения произвольного кода всё еще остается. | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2006 в 15:20)
| | Спасибо.
А в чем разница?
Сможеть, если получит админский доступ.
Но в этом случае, говорить можно о взломе любого сайта :)) | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 17:16)
| | кроме того в случае с поименным перечислениям всегла можно добавить какое-то конкретное имя файла типа if ($file != "." && $file != ".." && $file != ".htaccess" && $file != "index.html") { и так далее | |
|
|
|
|
|
|
|
для: Gandzas
(23.10.2006 в 17:16)
| | . - это текущая директория,
.. - это родительская директория
т.е. все остальные директории отличные от этих проходят, is_file() - проверяет является ли текущая позиция файлом. | |
|
|
|