Slide 1

Slide 1 text

Epic PHP #6 Рома Лапин, Evercode Lab

Slide 2

Slide 2 text

Работа с файлами

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Как правило • Открытие файла • Манипуляции с данными • Закрытие файла • Но можно и проще

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 9

Slide 9 text

Пишем в файл

Slide 10

Slide 10 text

Читаем из файла

Slide 11

Slide 11 text

Полезные константы • __LINE__ • __FILE__ • __DIR__

Slide 12

Slide 12 text

file() Считываем весь файл в массив. ! $line) { echo "Line #{$line_num} : " . $line . "
\n"; } ! $html = implode('', file('https://news.ycombinator.com/'));

Slide 13

Slide 13 text

Функции • is_dir($path); • is_file($path); • is_link($path); • is_readable($path); • is_writable($path); • file_exists($filename);

Slide 14

Slide 14 text

Функции. CSV $row = 1; if (($handle = fopen("test.csv", "r")) !== false) { while (($data = fgetcsv($handle, 1000, ",")) !== false) { $num = count($data); echo "

$num fields in line $row:

\n"; $row++; for ($c=0; $c < $num; $c++) { echo $data[$c] . "
\n"; } } fclose($handle); }

Slide 15

Slide 15 text

Функции. CSV $list = array ( array('aaa', 'bbb', 'ccc', 'dddd'), array('123', '456', '789'), ); ! $fp = fopen('file.csv', 'w'); ! foreach ($list as $fields) { fputcsv($fp, $fields); } ! fclose($fp);

Slide 16

Slide 16 text

Важно • Проверки файлов на существование • Проверки на отработку функций чтения и записи • Проверки проверок на проверки проверок • Ошибок при работе файлов обычно много

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");

Slide 37

Slide 37 text

setlocale • LC_ALL • LC_COLLATE • LC_NUMERIC • LC_TIME

Slide 38

Slide 38 text

strftime • Форматирует время и даты с учетом локали • http://strftime.net/

Slide 39

Slide 39 text

DateTime Самый модный, современный и удобный способ работы с датами в PHP.

Slide 40

Slide 40 text

DateTime format('m/d/Y') . "\n"; ! $now = new \DateTime(); echo 'Time to change your life is: ' . $now->format('H:i:s d.m.Y') . "\n";

Slide 41

Slide 41 text

DateTime • Форматирование • Сравнение • Операции с датами

Slide 42

Slide 42 text

DateTime. Сравнение

Slide 43

Slide 43 text

DateInterval add(new \DateInterval('P1M6D')); ! $diff = $end->diff($start); echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n"; // Difference: 1 month, 6 days (total: 37 days)

Slide 44

Slide 44 text

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

and echo strip_tags($text, '

');

Slide 60

Slide 60 text

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

Slide 66

Slide 66 text

Другие угрозы • Session Fixation • Session Hijacking • Command Injection • CSRF