Предотвращение атак RFI при использовании переменных URL

0

Как проверить, не указана ли переменная URL-адреса или нет? Например, если я ../index.php?page=skillsa неверный URL-адрес на своем веб-сайте: " ../index.php?page=skillsa ". Для этого я получаю сообщение об ошибке:

Предупреждение: include_once (views/skillsa.php): не удалось открыть поток: нет такого файла или каталога в /opt/lampp/htdocs/tut01/index.php в строке 22

Как я могу обрабатывать этот тип ошибок в следующем коде?

<?php
//error reporting
error_reporting(E_ALL);
ini_set("display_errors", 1);

//class for variables
include_once "classes/Page_Data.php";
$pageData = new Page_Data();

//
$pageData->title = "Portfolio site";
$pageData->content = include_once "views/navigation.php";
$pageData->css = "<link href='css/layout.css' rel='stylesheet'/>";

//url variables
$navigationIsClicked = isset($_GET['page']);
if($navigationIsClicked) {
    $fileToLoad = $_GET['page'];
} else {
    $fileToLoad = "home";
}
$pageData->content .= include_once "views/$fileToLoad.php";

//embedded style
$pageData->embeddedStyle = "
<style>
    nav a[href *= '?page=$fileToLoad'] {
        background-color: white;
    }
</style>";

$page = include_once "templates/page.php";

echo $page;

EDIT: Или я могу просто использовать массив для хранения всех переменных URL?

Обновленный код:

<?php
//error reporting
error_reporting(E_ALL);
ini_set("display_errors", 1);

$page_files=array( 'home', 'skills', 'projects', '404');

//class for variables
include_once "classes/Page_Data.php";
$pageData = new Page_Data();

//
$pageData->title = "Portfolio site";
$pageData->content = include_once "views/navigation.php";
$pageData->css = "<link href='css/layout.css' rel='stylesheet'/>";

//url variables
if(isset($_GET['page'])) {
    if (in_array($_GET['page'], $page_files)) {
        $fileToLoad = $_GET['page'];
    } else {
        $fileToLoad = '404';
    }
} else {
    $fileToLoad = 'home';
}

$pageData->content .= include_once "views/$fileToLoad.php";

//embedded style
$pageData->embeddedStyle = "
<style>
    nav a[href *= '?page=$fileToLoad'] {
        background-color: white;
    }
</style>";

$page = include_once "templates/page.php";

echo $page;
Теги:
security
dynamic
error-handling

1 ответ

0
Лучший ответ

Я не уверен, что это то, что вы хотите, но это то, что я думаю, вы хотите.

 //url variables
 if(isset($_GET['page'])) {
    if (in_array($_GET['page'], $page_files)) {
          //basename returns only the filename part of a path ~ might have to check this
          // when using just text such as "somepage", it used for things like "../../somepage" 
          // and returns just "somepage"
          $fileToLoad = "views/".basename( $_GET['page'] ) .".php";
          //echo $fileToLoad;
          if(!file_exists( $fileToLoad ) ){
               $fileToLoad = "views/404.php";
          }
     } else {
         $fileToLoad = "views/404.php";
     }
 } else {
     $fileToLoad = "views/home.php";
 }


 $pageData->content .= include_once $fileToLoad;
  • 0
    Что-то вроде того. Скажите, это хороший способ предотвратить атаки с удаленным включением файлов (хранить переменные URL в массиве)?
  • 0
    единственный файл, который они могут включить, должен быть в «представлениях», если вы используете basename ()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню