Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Помогите закрыть дыру в php
 
Скажите пожалуйста, что нужно сделать, чтобы через req нельзя было смотреть другие файлы, лежащие на сервере?


Код
<?php if (empty ($req)) { $req="1.php"; } include("$req"); ?>

...

<td><a href=index.php?req=1.php><img src="button/1-1.gif" alt="" border="0"
 onMouseOver="this.src='button/2-1.gif';"
 onMouseOut="this.src='button/1-1.gif';"></a></td>
...
 
В вашем случае самым простым будет:

index.php?req=1:

Код
<?php 
if (empty ($req)) { $req="1.php"; } 
else
{ $req=intval($req).".php";}

if(is_file($req))
include("$req"); 
else
echo 'Такой страницы нет';
?>
 
тут нельзя удалять свои сообщения что ли ?
 
Цитата
Stierus пишет:
тут нельзя удалять свои сообщения что ли ?

Нет!!!
 
Также, на всякий случай, следует указать open_basedir в конфигурации PHP, чтобы избежать инклуд-атак.
 
вот так правильно это делать

Код
<?php 
$req  = ''; //обнуляем
$reg = $_GET['reg']; // берём значение из гет запроса


   if($reg!='') //если не пустое
   {
      $reg = basename($_mod); // оставляем только базовое имя 
      if(file_exists($reg )){    // если файл существует
         include($reg ); // подключаем
      }else{
         Header('Location: error?code=404'); // иначе ошибка 404
      }

   }
   else
   {   
      include("1.php"); // если пустое
   } 

?> 
 
Цитата
Светлана Корнеева пишет:
Скажите пожалуйста, что нужно сделать, чтобы через req нельзя было смотреть другие файлы, лежащие на сервере?


<?php if (empty ($req)) { $req="1.php"; } include("$req"); ?>

А может лучше просто так не делать? Или если запрос уже примерно известен можно попробовать так:

switch ($req) {
 case 'news': require 'news.php'; break;
 case 'about': require 'about.php'; break;
 case default: require 'news.php'; break;
}

Вообщем всё от ситуации зависит
 
Думаю можно так сделать:

if (!empty($_GET['page']))
{
$page = $_GET['page'];
}
else
{
$page = 'main';
}
Switch ($page)
{
case 'main':
echo 'main';
break;
case 'test':
echo 'test';
break;
}
 
Цитата
p-range пишет:
Думаю можно так сделать:

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

include ("yourprefix_".$_GET['req']);

но если подключаемых страниц немного можно использовать и switch
 
скрипт Logos'a нормально работает и не требует, ни допольнительных префикс в именах ( там идёт перевод в численную переменную, все переходы по директориям исключены, подходят только числовые названия файлов ... все названия с текстом приравниваются к 0 ... 0.php можно зарезервировать на случай ошибки )

MiHoY , ты видел что бы уточнялась версия сервера php ? ... Далеко не во всех старых версиях есть этот массив, так что твой коммент не актуален ( хоть сейчас и следовало бы сделать именно так ).

s1b , для 3-х страниц - подойдёт, хоть вариант будет и хуже чем первый, а представь 10 000 case_ов ?

p-range  ... дурдом полный


ps

Первый вариант с минимальными исправлениями под конкретные нужды - лучшее из всего написанного, автору топика стоит посмотреть именно туда.
Страницы: 1
Читают тему