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

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

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

Имеется ли тут потенциально опасное место, нужно ли все страницы проиндексировать, или в принципе можно оставить как есть?
 
вобще мне кажется лучше проставлять полные пути к файлам, тогда не будет никаких проблем с безопасностью, с этой стороны
 
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, это не получится
 
Автор оригинала: Кром
include не зависит, зависит переменная в include. При register_globals = off, все пользовательские переменные изолируются от переменных самой программы.
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
Кром, не путай людей своими советами, register_globals здесь непричём. Если пользователь имеет дыру в скрипте то, register_globals = off её не заткнут.
 
Автор оригинала: Кром
Т. е. если в программе есть переменная $some_data, ее можно перекрыть таким образом: http://host.com/index.php?some_data=another_value
а при register_globals = off, это не получится
Если твой скрипт был так написан, то он просто перестанет работать.
 
Автор оригинала: metton
Оно подключается как-то по-другому или это не работает на винде?
У меня это работает и в виндах, и в unix'е. В чем именно выражается "не подключается"?
 
Автор оригинала: 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, ее можно заменить любым зловредным значением. Все что я хотел сказать.
 
Автор оригинала: Кром
to ONK

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


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

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

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

http://domain.com?page=345

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

if(!empty($_GET['page']))
{
if(file_exists("./mydir/".$_GET['page']))
{
//делаем что то с $_GET['page']
}
}
 
http://domain.com?page=../../../etc/passwd

Повторяю: не надо тащить в рот всякую гадость.
 
василыч, прочитай тему ещё раз и подумай получше.
 
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/
нет...
 
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']}
}
}

Вот не пойму, чес слово!
 
василыч2

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