From 0f5666ad7f033e0d8da49a97b9d35557a0c98fac Mon Sep 17 00:00:00 2001 From: miramir Date: Tue, 12 May 2015 00:31:07 +0500 Subject: [PATCH] fix punctuation --- docs/guide-ru/security-best-practices.md | 75 ++++++++++++------------ 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/docs/guide-ru/security-best-practices.md b/docs/guide-ru/security-best-practices.md index 0f95ab6bec..ceab4a89b8 100644 --- a/docs/guide-ru/security-best-practices.md +++ b/docs/guide-ru/security-best-practices.md @@ -6,7 +6,7 @@ Основные принципы ----------------- -Есть два основных принципа безопасности, независимо от того какое приложение разрабатывается: +Есть два основных принципа безопасности, независимо от того, какое приложение разрабатывается: 1. Фильтрация ввода. 2. Экранирование вывода. @@ -14,10 +14,10 @@ ### Фильтрация ввода -Фильтрация ввода означает, что входные данные никогда не должны считаться безопасными и вы всегда должны проверять +Фильтрация ввода означает, что входные данные никогда не должны считаться безопасными и вы всегда должны проверять, являются ли полученные данные допустимыми. Например, если мы знаем, что сортировка может быть осуществлена только по трём полям `title`, `created_at` и `status`, и поле может передаваться через ввод пользователем, лучше проверить -значение там где мы его получили: +значение там, где мы его получили: ```php $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 будет другой набор -символов. Так как ручное экранирование черевато ошибками Yii предоставляет различные утилиты для экранирования в +символов. Так как ручное экранирование черевато ошибками, Yii предоставляет различные утилиты для экранирования в различных контекстах. Как избежать SQL-иньекций ------------------------- -SQL-иньекции происходят когда текст запроса формируется склеивание неэкранированных строк, как показано ниже: +SQL-иньекции происходят, когда текст запроса формируется склеиванием неэкранированных строк, как показано ниже: ```php $username = $_GET['username']; $sql = "SELECT * FROM user WHERE username = '$username'"; ``` -Вместо того, чтобы подставлять корректное имя пользователя злоумышленик может передать вам в приложение что-то вроде +Вместо того, чтобы подставлять корректное имя пользователя, злоумышленник может передать вам в приложение что-то вроде `'; DROP TABLE user; --`. В результате SQL будет следующий: @@ -54,16 +54,16 @@ $sql = "SELECT * FROM user WHERE username = '$username'"; SELECT * FROM user WHERE username = ''; DROP TABLE user; --' ``` -Это валидный запрос, который будет искать пользователей с пустым именем, а затем удалит таблицу `user`, скорее всего -сломается приложение и будут потеряны данные (вы ведь делаете регулярное резервное копирование?). +Это валидный запрос, который сначала будет искать пользователей с пустым именем, а затем удалит таблицу `user`. +Скорее всего будет сломано приложение и будут потеряны данные (вы ведь делаете регулярное резервное копирование?). Большинство запросов к базе данных в Yii происходит через [Active Record](db-active-record.md), который правильно использует подготовленные запросы PDO внутри. При использовании подготовленных запросов невозможно манипулировать -запросом как это показано ниже. +запросом как это показано выше. Тем не менее, иногда нужны [сырые запросы](db-dao.md) или [построитель запросов](db-query-builder.md). В этом случае -вы должны использовать безопасные способы передачи данных. Если данные используются значения столбцов предпочтительнее -использовать подготовленные запросы: +вы должны использовать безопасные способы передачи данных. Если данные используются для сравнения со значением +столбцов предпочтительнее использовать подготовленные запросы: ```php // query builder @@ -80,8 +80,8 @@ $userIDs = $connection ->queryColumn(); ``` -Если данные используются в качестве имён столбцов или таблиц, то лучший путь это разрешить только предопределённый набор -значений: +Если данные используются в качестве имён столбцов или таблиц, то лучший путь - это разрешить только предопределённый +набор значений: ```php function actionList($orderBy = null) @@ -108,24 +108,25 @@ $rowCount = $connection->createCommand($sql)->queryScalar(); Как избежать XSS ---------------- -XSS или крос-сайтинговый скриптинг становится возможен когда не экранированный выходной HTML попадает в браузер. -Например, если пользователь может ввести свой имя и вместо `Alexander` он вводит ``, то -все страницы которые его выводят без экранирования будут выполнять JavaScript `alert('Hello!');` и в результате -будет выводится окно сообщения в браузере. В зависимости от вебсайта вместо невинных скриптов с сообщениями могут быть -отправлены сообщения используя ваше имя или даже выполнять банковские операции. +XSS или крос-сайтинговый скриптинг становится возможен, когда не экранированный выходной HTML попадает в браузер. +Например, если пользователь должен ввести свой имя, но вместо `Alexander` он вводит ``, то +все страницы, которые его выводят без экранирования, будут выполнять JavaScript `alert('Hello!');`, и в результате +будет выводится окно сообщения в браузере. В зависимости от сайта, вместо невинных скриптов с выводом всплывающего +hello, злоумышленниками могут быть отправлены скрипты, похищающие личные данные пользователей сайта, +либо выполняющие операции от их имени. -В Yii избежать XSS легко. В основном есть два варианта: +В Yii избежать XSS легко. На месте вывода текста необходими выбрать один из двух вариантов: 1. Вы хотите вывести данные в виде обычного текста. 2. Вы хотите вывести данные в виде HTML. -Если вам нужно вывести простой текст, то екранировать лучше следующим образом: +Если вам нужно вывести простой текст, то экранировать лучше следующим образом: ```php ``` -Если нужно вывести HTML вам лучше воспользоваться HtmlPurifier: +Если нужно вывести HTML, вам лучше воспользоваться HtmlPurifier: ```php @@ -136,43 +137,43 @@ XSS или крос-сайтинговый скриптинг становитс Как избежать CSRF ----------------- -CSRF это аббревиатура для межсайтинговой подмены запросов. Идея заключается в том, что многие приложения предполагают -что запросы приходящие от браузера отправляются самим пользователем. Это может быть неправдой. +CSRF - это аббревиатура для межсайтинговой подмены запросов. Идея заключается в том, что многие приложения предполагают, +что запросы, приходящие от браузера, отправляются самим пользователем. Это может быть неправдой. -Например, сайт `an.example.com` имеет URL `/logout`, который используя простой GET, разлогинивает пользователя. Пока -это запрос выполняется самим пользователем всё в порядке, но в один прекрасный день злоумышленники размещают код +Например, сайт `an.example.com` имеет URL `/logout`, который, используя простой GET, разлогинивает пользователя. Пока +это запрос выполняется самим пользователем - всё в порядке, но в один прекрасный день злоумышленники размещают код `` на форуме с большой посещаемостью. Браузер не делает никаких отличий между запросом изображения и запросом страницы, так что когда пользователь откроет страницу с таким тегом `img`, он разлогинится с сайта `an.example.com`. -Вот основная идея. Можно сказать, что в разлогировании пользователя нет ничего серъёзного, но отправить POST не намного +Вот основная идея. Можно сказать, что в разлогировании пользователя нет ничего серьёзного, но отправить POST не намного сложнее. -Для того чтоб избежать CSRF вы должны всегда: +Для того, чтоб избежать CSRF вы должны всегда: 1. Следуйте спецификациям HTTP, например запрос GET не должен менять состояние приложения. -2. Держите защиту CSRF в Yii включонной. +2. Держите защиту CSRF в Yii включенной. Как избежать нежелательного доступа к файлам -------------------------------------------- -По умолчанию webroot сервера указывает на каталог `web` где лежит `index.php`. В случае виртуального хостинга -это может быть недостижимо, в конечном итоге весь код, конфиги и логи могут оказаться в webroot сервера. +По умолчанию, webroot сервера указывает на каталог `web`, где лежит `index.php`. В случае использования виртуального +хостинга, это может быть недостижимо, в конечном итоге весь код, конфиги и логи могут оказаться в webroot сервера. -Если это так, то нужно запретить доступ ко всему кроме директории `web`. Если на вашем хостинге такое невозможно, +Если это так, то нужно запретить доступ ко всему, кроме директории `web`. Если на вашем хостинге такое невозможно, рассмотрите возможность смены хостинга. Как избежать отладочной информации и утилит в продуктиве -------------------------------------------------------- -В режиме отладки Yii отображает довольно подробные ошибки, которые полезны во время разработки. Дело в том, что +В режиме отладки, Yii отображает довольно подробные ошибки, которые полезны во время разработки. Дело в том, что подробные ошибки удобны для нападающего, так как могут раскрыть структуру базы данных, параметров конфигурации и части вашего кода. Никогда не запускайте продуктивное приложение с `YII_DEBUG` установленным в `true` в вашем `index.php`. Вы никогда не должны включать Gii на продуктиве. Он может быть использован для получения информации о структуре -базы данных, кода и может быть просто переписан код с помощью генератора Gii. +базы данных, кода и может позволить заменить файлы, генерируемые Gii автоматически. -Также следует избегат включения на продуктиве панели отладки, если только это деийствительно не необходимо. -Она раскрывает всё приложение и детали конфигурации. Если вам это абсолютно необходимо, проверьте дважды что доступ -ограничен только вашими IP-адресами. +Также следует избегать включения на продуктиве панели отладки, если только в этом нет острой необходимости. +Она раскрывает всё приложение и детали конфигурации. Если вам все таки нужно запустить панель отладки на продуктиве, +проверьте дважды что доступ ограничен только вашими IP-адресами.