fix punctuation

This commit is contained in:
miramir
2015-05-12 00:31:07 +05:00
parent 615f2771d4
commit 0f5666ad7f

View File

@ -6,7 +6,7 @@
Основные принципы Основные принципы
----------------- -----------------
Есть два основных принципа безопасности, независимо от того какое приложение разрабатывается: Есть два основных принципа безопасности, независимо от того, какое приложение разрабатывается:
1. Фильтрация ввода. 1. Фильтрация ввода.
2. Экранирование вывода. 2. Экранирование вывода.
@ -14,10 +14,10 @@
### Фильтрация ввода ### Фильтрация ввода
Фильтрация ввода означает, что входные данные никогда не должны считаться безопасными и вы всегда должны проверять Фильтрация ввода означает, что входные данные никогда не должны считаться безопасными и вы всегда должны проверять,
являются ли полученные данные допустимыми. Например, если мы знаем, что сортировка может быть осуществлена только являются ли полученные данные допустимыми. Например, если мы знаем, что сортировка может быть осуществлена только
по трём полям `title`, `created_at` и `status`, и поле может передаваться через ввод пользователем, лучше проверить по трём полям `title`, `created_at` и `status`, и поле может передаваться через ввод пользователем, лучше проверить
значение там где мы его получили: значение там, где мы его получили:
```php ```php
$sortBy = $_GET['sort']; $sortBy = $_GET['sort'];
@ -26,27 +26,27 @@ if (!in_array($sortBy, ['title', 'created_at', 'status'])) {
} }
``` ```
В Yii, вы скорее всего будете использовать [валидацию форм](input-validation.md), чтоб делать такие проверки. В Yii, вы, скорее всего, будете использовать [валидацию форм](input-validation.md), чтоб делать такие проверки.
### Экранирование вывода ### Экранирование вывода
Экранирование вывода означает, что данные в зависимости от контекста должны экранироваться, например в контексте Экранирование вывода означает, что данные в зависимости от контекста должны экранироваться, например в контексте
HTML вы должны экранировать `<`, `>` и похожие специальные символы. В контексте JavaScript или SQL будет другой набор HTML вы должны экранировать `<`, `>` и похожие специальные символы. В контексте JavaScript или SQL будет другой набор
символов. Так как ручное экранирование черевато ошибками Yii предоставляет различные утилиты для экранирования в символов. Так как ручное экранирование черевато ошибками, Yii предоставляет различные утилиты для экранирования в
различных контекстах. различных контекстах.
Как избежать SQL-иньекций Как избежать SQL-иньекций
------------------------- -------------------------
SQL-иньекции происходят когда текст запроса формируется склеивание неэкранированных строк, как показано ниже: SQL-иньекции происходят, когда текст запроса формируется склеиванием неэкранированных строк, как показано ниже:
```php ```php
$username = $_GET['username']; $username = $_GET['username'];
$sql = "SELECT * FROM user WHERE username = '$username'"; $sql = "SELECT * FROM user WHERE username = '$username'";
``` ```
Вместо того, чтобы подставлять корректное имя пользователя злоумышленик может передать вам в приложение что-то вроде Вместо того, чтобы подставлять корректное имя пользователя, злоумышленник может передать вам в приложение что-то вроде
`'; DROP TABLE user; --`. `'; DROP TABLE user; --`.
В результате SQL будет следующий: В результате SQL будет следующий:
@ -54,16 +54,16 @@ $sql = "SELECT * FROM user WHERE username = '$username'";
SELECT * FROM user WHERE username = ''; DROP TABLE user; --' SELECT * FROM user WHERE username = ''; DROP TABLE user; --'
``` ```
Это валидный запрос, который будет искать пользователей с пустым именем, а затем удалит таблицу `user`, скорее всего Это валидный запрос, который сначала будет искать пользователей с пустым именем, а затем удалит таблицу `user`.
сломается приложение и будут потеряны данные (вы ведь делаете регулярное резервное копирование?). Скорее всего будет сломано приложение и будут потеряны данные (вы ведь делаете регулярное резервное копирование?).
Большинство запросов к базе данных в Yii происходит через [Active Record](db-active-record.md), который правильно Большинство запросов к базе данных в Yii происходит через [Active Record](db-active-record.md), который правильно
использует подготовленные запросы PDO внутри. При использовании подготовленных запросов невозможно манипулировать использует подготовленные запросы PDO внутри. При использовании подготовленных запросов невозможно манипулировать
запросом как это показано ниже. запросом как это показано выше.
Тем не менее, иногда нужны [сырые запросы](db-dao.md) или [построитель запросов](db-query-builder.md). В этом случае Тем не менее, иногда нужны [сырые запросы](db-dao.md) или [построитель запросов](db-query-builder.md). В этом случае
вы должны использовать безопасные способы передачи данных. Если данные используются значения столбцов предпочтительнее вы должны использовать безопасные способы передачи данных. Если данные используются для сравнения со значением
использовать подготовленные запросы: столбцов предпочтительнее использовать подготовленные запросы:
```php ```php
// query builder // query builder
@ -80,8 +80,8 @@ $userIDs = $connection
->queryColumn(); ->queryColumn();
``` ```
Если данные используются в качестве имён столбцов или таблиц, то лучший путь это разрешить только предопределённый набор Если данные используются в качестве имён столбцов или таблиц, то лучший путь - это разрешить только предопределённый
значений: набор значений:
```php ```php
function actionList($orderBy = null) function actionList($orderBy = null)
@ -108,24 +108,25 @@ $rowCount = $connection->createCommand($sql)->queryScalar();
Как избежать XSS Как избежать XSS
---------------- ----------------
XSS или крос-сайтинговый скриптинг становится возможен когда не экранированный выходной HTML попадает в браузер. XSS или крос-сайтинговый скриптинг становится возможен, когда не экранированный выходной HTML попадает в браузер.
Например, если пользователь может ввести свой имя и вместо `Alexander` он вводит `<script>alert('Hello!');</script>`, то Например, если пользователь должен ввести свой имя, но вместо `Alexander` он вводит `<script>alert('Hello!');</script>`, то
все страницы которые его выводят без экранирования будут выполнять JavaScript `alert('Hello!');` и в результате все страницы, которые его выводят без экранирования, будут выполнять JavaScript `alert('Hello!');`, и в результате
будет выводится окно сообщения в браузере. В зависимости от вебсайта вместо невинных скриптов с сообщениями могут быть будет выводится окно сообщения в браузере. В зависимости от сайта, вместо невинных скриптов с выводом всплывающего
отправлены сообщения используя ваше имя или даже выполнять банковские операции. hello, злоумышленниками могут быть отправлены скрипты, похищающие личные данные пользователей сайта,
либо выполняющие операции от их имени.
В Yii избежать XSS легко. В основном есть два варианта: В Yii избежать XSS легко. На месте вывода текста необходими выбрать один из двух вариантов:
1. Вы хотите вывести данные в виде обычного текста. 1. Вы хотите вывести данные в виде обычного текста.
2. Вы хотите вывести данные в виде HTML. 2. Вы хотите вывести данные в виде HTML.
Если вам нужно вывести простой текст, то екранировать лучше следующим образом: Если вам нужно вывести простой текст, то экранировать лучше следующим образом:
```php ```php
<?= \yii\helpers\Html::encode($username) ?> <?= \yii\helpers\Html::encode($username) ?>
``` ```
Если нужно вывести HTML вам лучше воспользоваться HtmlPurifier: Если нужно вывести HTML, вам лучше воспользоваться HtmlPurifier:
```php ```php
<?= \yii\helpers\HtmlPurifier::process($description) ?> <?= \yii\helpers\HtmlPurifier::process($description) ?>
@ -136,43 +137,43 @@ XSS или крос-сайтинговый скриптинг становитс
Как избежать CSRF Как избежать CSRF
----------------- -----------------
CSRF это аббревиатура для межсайтинговой подмены запросов. Идея заключается в том, что многие приложения предполагают CSRF - это аббревиатура для межсайтинговой подмены запросов. Идея заключается в том, что многие приложения предполагают,
что запросы приходящие от браузера отправляются самим пользователем. Это может быть неправдой. что запросы, приходящие от браузера, отправляются самим пользователем. Это может быть неправдой.
Например, сайт `an.example.com` имеет URL `/logout`, который используя простой GET, разлогинивает пользователя. Пока Например, сайт `an.example.com` имеет URL `/logout`, который, используя простой GET, разлогинивает пользователя. Пока
это запрос выполняется самим пользователем всё в порядке, но в один прекрасный день злоумышленники размещают код это запрос выполняется самим пользователем - всё в порядке, но в один прекрасный день злоумышленники размещают код
`<img src="http://an.example.com/logout">` на форуме с большой посещаемостью. Браузер не делает никаких отличий `<img src="http://an.example.com/logout">` на форуме с большой посещаемостью. Браузер не делает никаких отличий
между запросом изображения и запросом страницы, так что когда пользователь откроет страницу с таким тегом `img`, он между запросом изображения и запросом страницы, так что когда пользователь откроет страницу с таким тегом `img`, он
разлогинится с сайта `an.example.com`. разлогинится с сайта `an.example.com`.
Вот основная идея. Можно сказать, что в разлогировании пользователя нет ничего серъёзного, но отправить POST не намного Вот основная идея. Можно сказать, что в разлогировании пользователя нет ничего серьёзного, но отправить POST не намного
сложнее. сложнее.
Для того чтоб избежать CSRF вы должны всегда: Для того, чтоб избежать CSRF вы должны всегда:
1. Следуйте спецификациям HTTP, например запрос GET не должен менять состояние приложения. 1. Следуйте спецификациям HTTP, например запрос GET не должен менять состояние приложения.
2. Держите защиту CSRF в Yii включонной. 2. Держите защиту CSRF в Yii включенной.
Как избежать нежелательного доступа к файлам Как избежать нежелательного доступа к файлам
-------------------------------------------- --------------------------------------------
По умолчанию webroot сервера указывает на каталог `web` где лежит `index.php`. В случае виртуального хостинга По умолчанию, webroot сервера указывает на каталог `web`, где лежит `index.php`. В случае использования виртуального
это может быть недостижимо, в конечном итоге весь код, конфиги и логи могут оказаться в webroot сервера. хостинга, это может быть недостижимо, в конечном итоге весь код, конфиги и логи могут оказаться в webroot сервера.
Если это так, то нужно запретить доступ ко всему кроме директории `web`. Если на вашем хостинге такое невозможно, Если это так, то нужно запретить доступ ко всему, кроме директории `web`. Если на вашем хостинге такое невозможно,
рассмотрите возможность смены хостинга. рассмотрите возможность смены хостинга.
Как избежать отладочной информации и утилит в продуктиве Как избежать отладочной информации и утилит в продуктиве
-------------------------------------------------------- --------------------------------------------------------
В режиме отладки Yii отображает довольно подробные ошибки, которые полезны во время разработки. Дело в том, что В режиме отладки, Yii отображает довольно подробные ошибки, которые полезны во время разработки. Дело в том, что
подробные ошибки удобны для нападающего, так как могут раскрыть структуру базы данных, параметров конфигурации и части подробные ошибки удобны для нападающего, так как могут раскрыть структуру базы данных, параметров конфигурации и части
вашего кода. Никогда не запускайте продуктивное приложение с `YII_DEBUG` установленным в `true` в вашем `index.php`. вашего кода. Никогда не запускайте продуктивное приложение с `YII_DEBUG` установленным в `true` в вашем `index.php`.
Вы никогда не должны включать Gii на продуктиве. Он может быть использован для получения информации о структуре Вы никогда не должны включать Gii на продуктиве. Он может быть использован для получения информации о структуре
базы данных, кода и может быть просто переписан код с помощью генератора Gii. базы данных, кода и может позволить заменить файлы, генерируемые Gii автоматически.
Также следует избегат включения на продуктиве панели отладки, если только это деийствительно не необходимо. Также следует избегать включения на продуктиве панели отладки, если только в этом нет острой необходимости.
Она раскрывает всё приложение и детали конфигурации. Если вам это абсолютно необходимо, проверьте дважды что доступ Она раскрывает всё приложение и детали конфигурации. Если вам все таки нужно запустить панель отладки на продуктиве,
ограничен только вашими IP-адресами. проверьте дважды что доступ ограничен только вашими IP-адресами.