Инклуд и безопасность

Кром

Новичок
надо в php.ini проставить: globals off , тогда файл так подключить будет невозможно
 

lanka

Новичок
Кстати, в продолжение темы.
А если я хочу вставлять, правда не инклудом, файлы только из определенной директории, но параметром page=filename, после чего отрабатывает следующий код:

<?
if (isset($_REQUEST['page'])) {
$page = $_REQUEST['page'];
if (file_exists("article/$page.htm")) {
readFile("article/$page.htm");
}
}
?>

Имеется ли тут потенциально опасное место, нужно ли все страницы проиндексировать, или в принципе можно оставить как есть?
 

Кром

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

metton

Guest
2Crazy

If "URL fopen wrappers" are enabled in PHP (which they are in the default configuration), you can specify the file to be included using an URL (via HTTP) instead of a local pathname. If the target server interprets the target file as PHP code, variables may be passed to the included file using an URL request string as used with HTTP GET. This is not strictly speaking the same thing as including the file and having it inherit the parent file's variable scope; the script is actually being run on the remote server and the result is then being included into the local script.
А как эту фичу подключить? Я думал, allow_url_fopen, но у меня стоит на On, а URL-ы всё равно не инклудятся...
Оно подключается как-то по-другому или это не работает на винде?
 

Кром

Новичок
include не зависит, зависит переменная в include. При register_globals = off, все пользовательские переменные изолируются от переменных самой программы.
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
 

ONK

Пассивист PHPСluba
Автор оригинала: Кром
include не зависит, зависит переменная в include. При register_globals = off, все пользовательские переменные изолируются от переменных самой программы.
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
Кром, не путай людей своими советами, register_globals здесь непричём. Если пользователь имеет дыру в скрипте то, register_globals = off её не заткнут.
 

ONK

Пассивист PHPСluba
Автор оригинала: Кром
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
Если твой скрипт был так написан, то он просто перестанет работать.
 

Crazy

Developer
Автор оригинала: metton
Оно подключается как-то по-другому или это не работает на винде?
У меня это работает и в виндах, и в unix'е. В чем именно выражается "не подключается"?
 

Crazy

Developer
Автор оригинала: metton
Можно поподробнее, если уж упомянул?
Эта фича зовется taint mode. Надеюсь, когда-нибудь это появится и в PHP -- чайникам эта фича очень помогла бы в деле выпрямления рук. Равно как и аналог "use strict".
 

Кром

Новичок
to ONK

1. файл inc.php
<?
$some_value = 1;
?>


2. файл index.php
<?
if (какое-то условие) include("inc.php");
echo "$some_value";
?>

Если условие во втором файле не выполняется, переменная не отобразится, что вроде и требовалось, но при register_globals = on, ее можно заменить любым зловредным значением. Все что я хотел сказать.
 

ONK

Пассивист PHPСluba
Автор оригинала: Кром
to ONK

1. файл inc.php
<?
$some_value = 1;
?>


2. файл index.php
<?
if (какое-то условие) include("inc.php");
echo "$some_value";
?>

Если условие во втором файле не выполняется, переменная не отобразится, что вроде и требовалось, но при register_globals = on, ее можно заменить любым зловредным значением. Все что я хотел сказать.
Если при не выполнении вот этого твоего условия "if (какое-то условие) " тебе ещё гдето дальше в скрипте понадобилась переменная $some_value (которая _НЕ_ определена), значит ты допустил ошибку в программе. Это неправильный подход к программированию, а самое главное это не имеет ровным счётом _никакого_ отношения к тому что здесь обсуждалось.
 

василыч

Guest
Люди!

А зачем всякие свитчи и пр. премудрости?
Разве низя так:

http://domain.com?page=345

В скрипте пишем:

if(!empty($_GET['page']))
{
if(file_exists("./mydir/".$_GET['page']))
{
//делаем что то с $_GET['page']
}
}
 

Crazy

Developer
http://domain.com?page=../../../etc/passwd

Повторяю: не надо тащить в рот всякую гадость.
 

ONK

Пассивист PHPСluba
василыч, прочитай тему ещё раз и подумай получше.
 

metton

Guest
2Кром
include не зависит, зависит переменная в include. При register_globals = off, все пользовательские переменные изолируются от переменных самой программы.
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
Почему это не получится?! Если у человека стоит register_globals = off, не думаю, что он будет использовать просто $some_data, пытаясь получить переменную из строки запроса. Я, конечно, знаю и умею ещё далеко не всё, но уж это-то я могу понять...

2Crazy
У меня это работает и в виндах, и в unix'е. В чем именно выражается "не подключается"?
В том, что вот так
http://localhost/index.php?page=index0.php
получается.
а вот так
http://localhost/index.php?page=http://www.ru/
нет...
 

василыч2

Guest
2ONK:
Прочитал, НЕ ПОНЯЛ! :)

Если надо сделать выборочную загрузку библиотек или исполняемых модулей, делай лечше так:

index.php?f=5

<?php
.
.

switch ($_GET['f']) {
case 1:
include ('xxx.php');
break;
case 2:
include ('yyy.php');
break;
case 5:
include ('zzzz.php');
break;
А если у меня [много] фалов???

И объясни, пожалуйста, что ты сделаешь при моём методе:

http://domain.com?area=kot&id=5

if(!empty($_GET['area']) && !empty($_GET['id']))
{
if(is_dir($_GET['area']))
{
if(file_exists("./".$_GET['area']."/".$_GET['page']) && )
{//делаем что то с $_GET['page']}
}
}

Вот не пойму, чес слово!
 

ONK

Пассивист PHPСluba
василыч2

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

metton studying

Guest
2василыч2
Чувак, ты по ходу не догнал, о чём говорил Crazy:
http://domain.com?page=../../../etc/passwd
А если много файлов, то есть такое понятие как массив, а если очень много, то и база данных :)
 
Сверху