maque.org.ua - Українською про PHP

Цей допис бере участь у конкурсі.

У дописі показується те, як безпечно використовувати змінну PHP_SELF, бо неправильне її використання може призвести до небезпечних наслідків. До речі, тема цього посту спала на думку після цих коментів.

Що воно таке PHP_SELF

Ця змінна повертає ім’я і шлях до файлу, з якого виконується. Вона використовується як значення для атрибуту action у формах. Наприклад:

[code lang=”HTML”]



[/code]

Якщо шлях до файлу http://www.yourserver.com/form-action.php, то змінна PHP_SELF матиме значення form-action.php. Якщо шлях, приміром, http://www.yourserver.com/dir1/form-action.php, то змінна PHP_SELF матиме значення /dir1/form-action.php.

Скажімо ми маємо такий код:

[code lang=”PHP”]
$name “;
echo “
You can use the following form again to enter a new name.”;
}
?>



[/code]

А шлях до цього файлу http://www.yourserver.com/form-action.php. То можна до цієї адреси додати такий код:

[code lang=”javascript”]
/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22
[/code]

Тобто повна адреса має бути така:

[code lang=”javascript”]
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22
[/code]

Тобто браузерові передасться такий код:

[code lang=”javascript”]

[/code]

А цей код призведе до того, що браузер викине вікно попередження зі словом xss. Та це лише невинний приклад. Справжня халепа у тому, що ось так використовуючи JavaScrip можна ініціювати значно шкідливіший сценарій, як-от: встановити посилання на файл, що лежить на іншому сервері, а той файл у свою чергу може містити шкідливий код, який змінює, скажімо, значення глобальних змінних або надіслати значення, які передаються через форму, на іншу адресу, перехоплюючи вказані у формі дані.

Цікаво те, що ця проблема розв’язується просто за допомогою використання функції htmlentities(). Тобто ми її маємо застосувати до:

[code lang=”PHP”]
$_SERVER[‘PHP_SELF’]
[/code]

Тобто увесь код має у цьому випадку виглядати так:

[code lang=”PHP”]
$name “;
echo “
You can use the following form again to enter a new name.”;
}
?>



[/code]

Тепер якщо буде використано такий код:

[code lang=”HTML”]
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22
[/code]

У нашого хакера нічого не вийде, бо на виході він отримає:

[code lang=”HTML”]


[/code]

Хоча на деяких серверах така конвертація задля безпеки працює автоматично, але краще не ризикувати і з PHP_SELF завжди використовувати htmlentities().

Переклад звідси.


Як і завжди, будемо раді відповісти на Ваші запитання, вислухати Вашу критику, зауваження та поради.

Якщо вміст цієї статті Вам видається корисним та цікавим, поділіться посиланням на нього через Твіттер, Фейсбук, Google + чи Vkontakte.

Дуже дякую,
адмін (Колос Віталій)


Учасник конкурсу(maque.org.ua скоро 3 роки)