Лучший способ избежать инжекции кода в PHP

Да, просто экспортируйте его с тем же хранилищем ключей и тем же именем пакета и , чтобы увеличить версию .

23
задан pek 2 September 2008 в 05:24
поделиться

8 ответов

Используйте белый список и удостоверьтесь, что страница находится в белом списке:

  $whitelist = array('home', 'page');

  if (in_array($_GET['page'], $whitelist)) {
        include($_GET['page'].'.php');
  } else {
        include('home.php');
  }
40
ответ дан 29 November 2019 в 00:53
поделиться

Другой способ санировать вход состоит в том, чтобы удостовериться что только допустимые символы (не "/", ".", ": "...), находятся в нем. Однако не используйте черный список для плохой символы, но белый список для допустимых символов:

$page = preg_replace('[^a-zA-Z0-9]', '', $page);

... сопровождаемый file_exists.

Тот способ, которым можно удостовериться, что только сценарии Вы хотите быть выполненными, выполняются (например, это исключило бы "blabla.inc.php", потому что"". не позволяется).

Примечание: Это - своего рода "взлом", потому что тогда пользователь мог выполнить "h.o.m.e", и это даст "домашнюю" страницу, потому что все, что это делает, удаляет все запрещенные символы. Это не предназначается для остановки "умников", которые хотят к милому материалу со страницей, но это остановит людей, делающих действительно плохой вещи.

BTW: Другая вещь, которую Вы могли сделать в Вас файл .htaccess , состоит в том, чтобы предотвратить очевидные попытки нападения:

RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /–http– [F,NC]
RewriteRule http: /–http– [F,NC]

Тот путь все доступы страницы с "http": URL (и строка запроса) приводит к "Запрещенному" сообщению об ошибке, даже не достигая сценария PHP. Это приводит к меньшему количеству загрузки сервера.

Однако имеют в виду, что никакой "http" не позволяется в строке запроса. Вы сила веб-сайта МОГЛИ БЫ потребовать его в некоторых случаях (возможно, при заполнении формы).

BTW: Если можно читать на немецком языке: Я также имею сообщение в блоге по той теме.

14
ответ дан 29 November 2019 в 00:53
поделиться

Правило № 1 при принятии ввода данных пользователем, всегда санируют его. Здесь, Вы не санируете свою переменную страницы GET перед передачей ее в, включают. Необходимо выполнить основную проверку, чтобы видеть, существует ли файл на сервере перед включением его.

5
ответ дан 29 November 2019 в 00:53
поделиться

Pek, существует много вещей волноваться о дополнении к внедрению SQL или даже различных типах инжекции кода. Теперь могло бы быть хорошее время для дальнейшего изучения безопасности веб-приложения в целом.

От предыдущего вопроса на перемещение от рабочего стола до веб-разработки , я записал:

Руководство OWASP по Созданию Безопасных веб-приложений и веб-сервисов должно быть обязательным чтением для любого веб-разработчика, который хочет отнестись к безопасности серьезно (который должен быть весь веб-разработчики). Существует много принципов для следования за той справкой с мышлением, требуемым при размышлении о безопасности.

При чтении большого документа не для Вас, затем взгляните на видео семинара, который Mike Andrews дал в Google паре лет назад [приблизительно 112] Как К Break Web Software .

5
ответ дан 29 November 2019 в 00:53
поделиться

Я предполагаю, что Вы имеете дело с файлами в том же каталоге:

<?php
if (isset($_GET['page']) && !empty($_GET['page'])) {
  $page = urldecode($_GET['page']);
  $page = basename($page);
  $file = dirname(__FILE__) . "/{$page}.php";
  if (!file_exists($file)) {
    $file = dirname(__FILE__) . '/home.php';
  }
} else {
  $file = dirname(__FILE__) . '/home.php';
}
include $file;
?>

Это не слишком симпатично, но должно устранить Вашу проблему.

4
ответ дан 29 November 2019 в 00:53
поделиться

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

не перестраивают колесо. Используйте платформу. Любой из них не лучше, чем ни один. Начальные инвестиции времени в изучение его платят почти немедленно.

3
ответ дан 29 November 2019 в 00:53
поделиться

Некоторые хорошие ответы до сих пор, также стоящий указания на несколько специфических особенностей PHP:

файл открывают использование функций обертки для поддержки различных протоколов. Это включает способность открыть файлы по локальной сети окон, HTTP и FTP, среди других. Таким образом в конфигурации по умолчанию, код в исходном вопросе может легко использоваться для открытия любого произвольного файла в Интернете и вне; включая, конечно, все файлы на локальных дисках сервера (который пользователь веб-сервера может считать). /etc/passwd всегда забавный.

Безопасный режим и open_basedir может использоваться для ограничения файлов за пределами определенного каталога от того, чтобы быть полученным доступ.

Также полезный установка allow_url_fopen конфигурации, которая может отключить доступ через URL к файлам при использовании файла открытые функции. ini-set может использоваться, чтобы установить и сбросить это значение во времени выполнения.

Это вся хорошая защита безопасности нейтрализации, но используйте белый список для включения файла.

1
ответ дан 29 November 2019 в 00:53
поделиться

@pek - Это не будет работать, как Ваши ключи массива 0 и 1, не 'домой' и 'страница'.

Этот код должен добиться цели, я верю:

<?php

$whitelist = array(
  'home',
  'page',
);

if(in_array($_GET['page'], $whitelist)) {
  include($_GET['page'] . '.php');
} else {
  include('home.php');
}

?>

Поскольку у Вас есть белый список, не должно быть потребности в file_exists() также.

0
ответ дан 29 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: