Делаем выпадающий список на PHP


Как сделать выпадающее вертикальное меню на PHP и HTML?

Именно это мы сейчас и разберем. Продолжая тему разработки простых, но безопасных сценариев на PHP, основной акцент, как всегда, будет делаться именно на безопасность. И так, стоит задача, сделать вертикальное меню, в виде выпадающего списка.

Выпадающий список на PHP

Выпадающий список на PHP

 

Как это можно реализовать на PHP? Очень просто!  Ну например, у нас есть файл index.php, который в зависимости от выбранного раздела в выпадающем списке, должен отображать соответствующий контент на странице. Реализуется это следующим образом:

1. Создаем файлы в формате .html, которые и будут содержать в себе необходимый для вывода контент.

2. Создаем (пишем) в скрипте index.php необходимые условия, для вывода соответствующей информации.

3. Рассматриваем созданный скрипт с позиции безопасности выполняемого сценария.

Ну, вроде, как с теорией закончил, переходим к практике. Открываем PHP редактор, можно notepad++, но лично мне больше нравится PHPExpertEdition. Сначала создаем статические страницы в формате .html, которые и будут содержать необходимую информацию. Там можно написать все, что душе угодно:) В итоге у нас должно получиться, как минимум два файла  first.html и second.html, соответственно потом их можно будет сделать сколько угодно, поняв основной алгоритм работы кода.

Для вывода выпадающего списка в файле index.php создаем html форму, и ниже пишем PHP скрипт такого содержания:

<HTML>
<HEAD>
<TITLE>Menu PHP</TITLE>
</HEAD>
<BODY>
<center><h3>Выпадающее меню на PHP</h3></center>
<hr>
<div align="center">
<form action="index.php" method="get">
<select size="1" name="where">
<option value="1">Первый</option>
<option value="2">Второй</option>
</select>
<input type="submit" value="Go">
</form>
</div>
<hr>
<?
if (isset($_GET['where']))
{
if ($_GET['where']==1)
$file = 'first.html';
if ($_GET['where']==2)
$file = 'second.html';
include($file);
}
?>
</BODY>
</HTML>

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

bug-in-program-code-PHP

bug-in-program-code-PHP

Уязвимость данного скрипта заключается в том, что переменная $file  остается не инициализирована, и в этом случае значение автоматически созданной переменной попадает сразу в функцию include, а она в свою очередь успешно ее (переменную) подключает и отображает на экране. И это может быть не только файл конфигурации .htaccess. Для того, что-бы взломать данный сценарий, достаточно параметру where передать не предусмотренное кодом значение, ну например 3. А так, как это значение не предусмотрено сценарием, то просто переменная $file не пройдет инициализацию. Поэтому, ей можно будет задать произвольное значение через строку URL.

   http://localhost/index.php?where=3&file=.htaccess

 

Данная уязвимость подключения файлов может быть использована не только для показа файлов на сервере, здесь ведь можно и фантазию проявить. :)

В качестве примера можно привести уязвимый плагин который использует сайт работающий под управлением CMS WordPress, и позволяющий провести SQL инъекцию к таблице wp_users. И если доступ не закрыт к файлу wp-login.php, то у злоумышленника есть все шансы создать ключ для активации нового пароля к админке и совершить взлом пароля администратора WordPress.

Но это так, небольшое отступление от темы. 😀

Вариант решения данной проблемы достаточно прост, переменную $file просто необходимо инициализировать до начала использования, т. е. присвоить ей значение по умолчанию.

<?
if (isset($_GET['where']))
$file='';
{
if ($_GET['where']==1)
$file = 'first.html';
if ($_GET['where']==2)
$file = 'second.html';
include($file);
}
?>

Здесь, если параметр where передан скрипту, то переменная будет инициализирована корректно, иначе просто окажется пустой. Вот такое получилось [безопасное] выпадающее меню на PHP.

P.S. Создавая сценарии необходимо учитывать и соответственно исключать все возможные векторы атак. Только так можно создать проект, который будет отвечать правилам безопасности и востребован заказчиком. До новых встреч!