Как правило
• Открытие файла
• Манипуляции с данными
• Закрытие файла
• Но можно и проще
Slide 5
Slide 5 text
file_get_contents()
Считывает все содержимое файла в виде строки.
!
Slide 6
Slide 6 text
file_put_contents()
Пишет строку в файл.
!
Slide 7
Slide 7 text
Как правило
• $fp = fopen(‘somedata.txt’, ‘w’);
• fread($fp , 1024 );
• fwrite($fp , ‘hello’);
• fclose($fp);
Slide 8
Slide 8 text
Режимы
• r — только чтение
• r+ — одновременно чтение и запись
• w — создание нового пустого файла
• w+ — r+ и w вместе
• a — запись в конец файла
• a+ — еще и создаст, если что
Важно
• Проверки файлов на существование
• Проверки на отработку функций чтения
и записи
• Проверки проверок на проверки
проверок
• Ошибок при работе файлов обычно
много
Slide 17
Slide 17 text
Задание
На сайте http://chuckipsum.com/ берем текст и
сохраняем в файл chuck.txt в дереве нашего
проекта. Далее все результаты пишем в новый файл
result.txt.
!
1. Переставить абзацы в тексте в обратном порядке
2. Заменить каждое вхождение “Chuck Norris” на
“Чебурашка”. А если скучно, то только каждое
второе.
3. Удалить каждую третюю строку.
Slide 18
Slide 18 text
Задание
Делаем простой импорт данных в БД.
index.php: форма с файловым полем
import.php: сохраняем файл в каталог data, каждую
строчку файла сохраняем в табличку messages(id,
row) в базе epicphp, делаем редирект обратно на
index.php.
Если при обработке была ошибка, сохраняем ее в
сессию и выводим на index.php после редиректа.
Slide 19
Slide 19 text
Работа с датами
и временем
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
Даты и время
• Нужны очень часто
• И очень важны
• В контексте бизнес-логики приложений
(время транзакций, подсчеты, ...)
• В контексте сопутствующей информации
(логи, метки данных, ...)
Slide 22
Slide 22 text
time()
Возвращает текущее абсолютное время. Это число
равно количеству секунд, которое прошло с
полуночи 1 января 1970 года (с начала эпохи
UNIX).
!
Значение не зависит от часового пояса (UTC).
Slide 23
Slide 23 text
time()
Slide 24
Slide 24 text
time()
Slide 25
Slide 25 text
date()
Самая популярная и олдскульная функция для
форматирования даты и времени.
Slide 26
Slide 26 text
date()
// Monday
echo date("l");
!
// Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
!
// July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
Slide 27
Slide 27 text
date()
• второй параметр — абсолютное время
(timestamp)
• если timestamp не указан, по умолчанию
time()
• Лучше в строке формата не вставляйте
дополнительных слов и символов — без
правильной обработки вывод может
быть неожиданным
Slide 28
Slide 28 text
date()
Slide 29
Slide 29 text
mktime()
Генерит timestamp для конкретной даты.
!
Slide 30
Slide 30 text
strtotime()
Конвертит английское строковое представление времени в timestamp.
Отличается умом и сообразительностью.
!
Slide 31
Slide 31 text
Проблемы работы с
датами и временем
Slide 32
Slide 32 text
Проблемы работы с
датами и временем
• Часовые пояса
• Переходы на летнее/зимнее время
• Локализация
• Разница форматов
Slide 33
Slide 33 text
Часовые пояса
Slide 34
Slide 34 text
Часовые пояса
Попробуйте
!
Slide 35
Slide 35 text
Локализация
Slide 36
Slide 36 text
Локализация
// выводит названия дней на разных языках
// локали должны быть установлены в системе
!
setlocale(LC_TIME, "fi_FI");
echo strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo strftime(" in German %A.\n");
DateInterval
• Не пишите код, которые полагается на
фиксированне число секунд в каждом
дне. Часовые пояса и перевод времени
все вам сломают.
• Используйте промежутки времени
Slide 45
Slide 45 text
DatePeriod
format('m/d/Y') . ' ';
}
Slide 46
Slide 46 text
Даты и БД
• НЕ ИСПОЛЬЗУЙТЕ VARCHAR!
• TIMESTAMP
• проблема Y2K38 (32-bit integer)
• DATETIME
• DATE, TIME, YEAR
Slide 47
Slide 47 text
Задание
Определите сколько дней осталось до 14 июля, 31
декабря, до вашего дня рождения.
!
Сколько часов осталось до конца дня?
!
Вывести дату 15 дней назад.
Вывести дату на 5 месяцев вперед.
!
По возможности сделайте это и с помощью
функций, и с помощью DateTime.
Slide 48
Slide 48 text
Безопасность
приложений
Slide 49
Slide 49 text
Безопасность
Slide 50
Slide 50 text
Уровни
• Сам сервер
• База данных
• PHP скрипты
Slide 51
Slide 51 text
Концепции
• Plan for failure
• Fail early
• Принцип минимальных привилегий
• Фильтрация
• Экранирование
Slide 52
Slide 52 text
Fail early
Slide 53
Slide 53 text
Fail early
// Development
!
display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On
Slide 54
Slide 54 text
Fail early
// Production
!
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On
Slide 55
Slide 55 text
Register Globals
Если PHP < 5.4.0, убедитесь, что в php.ini
register_globals = off
Slide 56
Slide 56 text
Конфиги
Храните конфиги там, где их нельзя посмотреть
напрямую. И основной код желательно тоже.
!
├── src
│ ├── App
│ ├── config.php
│ └── views
├── web
│ └── index.php
Slide 57
Slide 57 text
Валидация
• Данным от пользователей доверять
нельзя ($_GET, $_POST, файлы, куки...)
• Валидируйте данные сразу, не оставляйте
на потом
• Сообщайте пользователям, что пошло не
так, сразу
• Whitelist vs Blacklist
Slide 58
Slide 58 text
Ситуации
• Пользователь ввел данные, которые
требовалось и в нужном формате
• Пользователь ввел что-то не так, не
разобравшись в ваших требованиях
• Пользователь проверяет вашу систему на
прочность неправильными данными
Slide 59
Slide 59 text
strip_tags
Test paragraph.
Other text';
echo strip_tags($text);
echo "\n";
!
// Allow
htmlspecialchars &
htmlentities
Test", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
!
$str = "A 'quote' is bold";
!
// A 'quote' is <b>bold</b>
echo htmlentities($str);
!
// A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
Slide 61
Slide 61 text
Валидация
Slide 62
Slide 62 text
Очистка
$email = '([email protected])';
!
$sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) {
echo "This (c) sanitized email address is considered valid.\n";
echo "Before: $email\n";
echo "After: $sanitized_email\n";
}
Slide 63
Slide 63 text
filter_input
Slide 64
Slide 64 text
XSS
index.php?name=guestalert('attacked')
!
";
Slide 65
Slide 65 text
Загрузка файлов
• Проверять тип файла PHP функциями
• Выключить вывод списков файлов для
директорий загрузки и возможность
выполнять файлы в них
• Можно располагать директории загрузок
вне Document root