2010-04-11 16 views
3

Я хочу знать, безопасен ли мой код и есть ли другие безопасные альтернативы для включения внешних файлов.PHP include() альтернатива?

Так что это мой пример кода, безопасен ли он? Как я могу сделать его более безопасным? Благодаря!

<?php switch($_GET['p']){ 
    case 'test1': 
     include 'test1.php'; 
     break; 
    case 'test2': 
     include 'test2.php'; 
     break; 
    case 'test': 
       echo 'something'; 
     include 'pages/test.php'; 
       echo 'something'; 
     break; 
    default: 
     include 'main.php'; 
     break; 
} ?> 

ответ

6

Ваш код в порядке. Существует не проблема условно, включая файлы, как вы делаете, поскольку имена файлов жестко запрограммированы. Проблема возникает, когда включенный файл основан на неуспешенном значении от пользователя. Например

include $_GET['p']; 

который может включать в себя все, что пользователь хочет (в зависимости от настроек PHP может также включать в себя файлы на других доменах)

Другие варианты являются вариациями на то, что вы делаете

require и require_once сбой, если файл не существует. inlucde_once и require_once убедитесь, что файл включен только один раз, поэтому этот файл был взломан в другом месте программы, он не будет включен.

include_once 'myfile.php'; 
include_once 'myfile.php'; //does nothing as the file is already included 

Если у вас есть классы использования, есть также вариант с autoloader. Из внешнего вида вашего приложения вам придется перестроить его, чтобы использовать его.

0

Увидев, что вы включаете только тех, кого вы жестко закодировали, я не понимаю, почему это небезопасно. Однако это не внешние файлы, но я понимаю, что вы имеете в виду. Внешнее будет означать на другом сервере.

Что касается вашего вопроса, единственная альтернатива include - require, но это не обязательно безопасно, это просто работает по-другому.

0

Да, совершенно безопасно.

Вы включаете файлы, которые знаете содержание, и не делаете его на основе переменных, поступающих из внешних источников. включение не приведет к сбою вашего сценария, если он не может загрузить, если это то, что вам нужно, выберите require('filename');.

-1

Вы могли бы сделать, что более читаемым, следующим образом:

$safeIncludes = array('test1', 'test2', 'test3'); 
$p = $_GET['p']; 
if(in_array($p, $safeIncludes)) { 
    $scriptName = $p . '.php'; 
    include($scriptName); 
} 

Другие, чем это является безопасным, как другие указали.

+0

Но если его всего несколько страниц, стоит ли выделять массив и поиск его, если может сделать простой переключатель()? Я не понимаю, почему его невозможно прочитать? (если только случаи значительно не выросли, т. е. 20+) –

+0

@Tim Post Возможно, поэтому - я действительно думал, что это стоит предложить, так как любые другие модификации должны произойти только в массиве. Более того, если он решит сохранить список разрешенных скриптов в БД, он будет * нужен * что-то вроде выше. – karim79

+0

На самом деле это не соответствует указанному коду - нет значения по умолчанию, и проверка не выполняется. Он короче, но не является (возможно) более читаемым для начинающих программистов. – AndyS

0

Это безопасно, как есть, и инструкция switch сделала логику более ясной. Просто чтобы сделать его более безопасным, вы можете использовать $ __ POST, чтобы скрыть источник данных переменных переменных, чтобы сделать его немного более безопасным. : D

1

Перед тем, как войти в коммутатор, вы можете изучить содержимое $_GET['p']. Если он содержит специальные символы, мусор или что-то еще, ваша программа может захотеть зарегистрировать инцидент (а не тратить время на создание страницы).

По крайней мере, приятный и вежливый «Извините, мы не смогли обработать ваш запрос», страница будет в порядке.

Это все еще позволяет переключаться на главную страницу при условии, что p содержит что-то достойное переключателя, оценивающего в первую очередь.

Это особенно актуально, если на главной странице выполняется любое количество запросов для рендеринга. Рано или поздно кто-то заметит вашу структуру URI и решит, что было бы весело играть с ней, не записывать циклы процессора на идиотов :)