CakePHP - Manual11/Security /wiki/Manual11/Security History/revisions of CakePHP/Manual11/Security en-us 2008-02-01 16:32:33 /wiki/Manual11/Security/show?time=2008-02-01+16%3A32%3A33 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a name=".manual11.security" href="/wiki/Manual11/Security" class="">/Manual&nbsp;11&nbsp;/&nbsp;Security</a> за <a href="/wiki/Manual11/Security?time=2008-02-01+16%3A32%3A33">2008-02-01 16:32:33</a> и <a href="/wiki/Manual11/Security">2008-05-17 15:26:08</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Компонент безопасности используется для&nbsp;защиты действий вашего контроллера от&nbsp;злоумышленных и&nbsp;неподходящих запросов. Это&nbsp;позволяет вам&nbsp;устанавливать условия, только при&nbsp;выполнении которых можно будет запросить действие, и&nbsp;опционально определить что&nbsp;делать с&nbsp;запросами, которые не&nbsp;удовлетворяют условия. Опять-таки, перед использованием компонента безопасности, вы&nbsp;должны убедиться что&nbsp;'Security' добавлен в&nbsp;массив $components вашего контроллера.<br /> Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответствуют, то&nbsp;действию разрешено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защитить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ аутентификации в&nbsp;Разделе 4 ниже.<br /> Например, если у&nbsp;меня есть действие в&nbsp;<span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>, которое отображает содержимое формы, переданное методом POST, в&nbsp;действии в&nbsp;<span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a>, тогда компонент безопасности должен быть включен и&nbsp;в <span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a> (который принимает запросы, и&nbsp;в общем-то защищает действие), и&nbsp;в <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> (откуда поступают запросы).</div><br /> <b>Удалено:</b><br /> <div class="deletions">Компонент безопасности используется для&nbsp;защиты действий вашего контроллера от&nbsp;злоумышленных и&nbsp;неподходящих запросов. Это&nbsp;позволяет вам&nbsp;устанавливать условия, только при&nbsp;выполнении которых можно будет запросить действие, и&nbsp;опционально определить что&nbsp;делать с&nbsp;запросами, которые не&nbsp;удовлетворяют условия. Опять-таки, перед использованием компонента безопасности, вы&nbsp;должны убедиться что&nbsp;'Security' добавлен в&nbsp;масив $components вашего контроллера.<br /> Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответсвую, то&nbsp;действию разрешаено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защитить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ атунтификации в&nbsp;Разделе 4 ниже.<br /> Например, если у&nbsp;меня есть действие в&nbsp;<span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>, которое отображает содержимое формы, переданное методом POST, в&nbsp;действии в&nbsp;<span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a>, тогда компонет безопасности должен быть включен и&nbsp;в <span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a> (который принимает запросы, и&nbsp;в общем-то защищает действие), и&nbsp;в <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> (откуда поступают запросы).</div></div> 2008-02-01 15:50:22 /wiki/Manual11/Security/show?time=2008-02-01+15%3A50%3A22 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual11/Security" class="">/Manual&nbsp;11&nbsp;/&nbsp;Security</a> за <a href="/wiki/Manual11/Security?time=2008-02-01+15%3A50%3A22">2008-02-01 15:50:22</a> и <a href="/wiki/Manual11/Security?time=2008-02-01+16%3A32%3A33">2008-02-01 16:32:33</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><a name="h40-1"></a><h1>Компонент безопасности</h1> <!--notypo--><fieldset class="table_of_contents"><legend><strong> Оглавление документа </strong></legend><div class="toc1"><a href="#h40-2">Введение</a></div><div class="toc1"><a href="#h40-3">Защита действий контроллера</a></div><div class="toc2"><a href="#h40-4">requirePost</a></div><div class="toc2"><a href="#h40-5">requireAuth</a></div><div class="toc1"><a href="#h40-6">Управление недействительными запросами</a></div><div class="toc1"><a href="#h40-7">Продвинутый запрос аутентификации</a></div></fieldset><!--/notypo--><a name="h40-2"></a><h2>Введение</h2> Компонент безопасности используется для&nbsp;защиты действий вашего контроллера от&nbsp;злоумышленных и&nbsp;неподходящих запросов. Это&nbsp;позволяет вам&nbsp;устанавливать условия, только при&nbsp;выполнении которых можно будет запросить действие, и&nbsp;опционально определить что&nbsp;делать с&nbsp;запросами, которые не&nbsp;удовлетворяют условия. Опять-таки, перед использованием компонента безопасности, вы&nbsp;должны убедиться что&nbsp;'Security' добавлен в&nbsp;масив $components вашего контроллера.<a name="h40-3"></a><h2>Защита действий контроллера</h2> Компонент безопасности содержит два&nbsp;основных метода для&nbsp;распределения доступа к&nbsp;действиям контроллера:<a name="h40-4"></a><h3>requirePost</h3> <ul><li> string $action1 </li><li> string $action2 </li><li> string $action3...</li></ul> Для&nbsp;выполнения определенного действия, нужно чтобы оно&nbsp;было запрошено через POST.<a name="h40-5"></a><h3>requireAuth</h3> <ul><li> string $action1 </li><li> string $action2 </li><li> string $action3...</li></ul> Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответсвую, то&nbsp;действию разрешаено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защитить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ атунтификации в&nbsp;Разделе 4 ниже.<br /> Но&nbsp;сначала давайте взглянем на&nbsp;простой пример:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">ThingsController&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">AppController<br /></span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">$components&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'Security'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">beforeFilter</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Security</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">requirePost</span><span style="color: #007700">(</span><span style="color: #DD0000">'delete'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">delete</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Это&nbsp;будет&nbsp;происходить&nbsp;только&nbsp;если&nbsp;действие&nbsp;вызвано&nbsp;через&nbsp;POST<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Thing</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">del</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> Здесь мы&nbsp;говорим компоненту безопасности, что&nbsp;действие 'delete' требует запроса POST. Метод beforeFilter() обычно там&nbsp;где вы&nbsp;хотите сообщить Security (и большинству других компонентов) что&nbsp;делать с&nbsp;самим собой. Он&nbsp;тогда будет делать что&nbsp;сказано сразу после того, как&nbsp;вызван beforeFilter(), но&nbsp;сразу перед тем&nbsp;как вызвано само действие.<br /> Вы&nbsp;можете протестировать это, введя ссылку для&nbsp;действия в&nbsp;браузер и&nbsp;увидете, что&nbsp;произойдет.<a name="h40-6"></a><h2>Управление недействительными запросами</h2> Что&nbsp;ж, если запрос не&nbsp;соответствует требованиям, которые мы&nbsp;определили, что&nbsp;с&nbsp;ним происходит? По&nbsp;умолчанию, запрос пропадает (black-holed), что&nbsp;значит, что&nbsp;клиенту посылается ошибка 404, а&nbsp;приложение сразу же&nbsp;завершает свою работу. Однако, у&nbsp;компонента безопасности есть свойство $blackHoleCallback, в&nbsp;котором вы&nbsp;можете вписать имя&nbsp;своей функции колбека, определенной в&nbsp;вашем контроллере.<br /> Вместо того, чтобы просто выдавать ошибку 404 и&nbsp;потом ничего, это&nbsp;свойство позволяет вам&nbsp;выполнять какие-нибудь дополнительные проверки запроса, переадресовывать запрос в&nbsp;другое мето, или&nbsp;даже записать в&nbsp;лог IP&nbsp;адрес грешащего клиента. Однако, если вы&nbsp;выберете свой колбек, выход из&nbsp;приложения в&nbsp;случае недействительного запроса ложится на&nbsp;вашу совесть. Если ваш&nbsp;колбек возвращает true, тогда компонет безопасности продолжит проверять запрос по&nbsp;другим определенным требованиям. Иначе, проверка останавливается, а&nbsp;ваше приложение продолжает свободно работать.<a name="h40-7"></a><h2>Продвинутый запрос аутентификации</h2> Метод requireAuth() позволяет вам&nbsp;дать максимум деталей при&nbsp;определении как&nbsp;и&nbsp;откуда будет получен доступ к&nbsp;действию, но&nbsp;это происходит с&nbsp;использованием обуславливания, которое становится более ясным, когда вы&nbsp;понимаете как&nbsp;этот метод аутентификации работает. Как&nbsp;начато уже&nbsp;выше, requireAuth() работает сравнением ключа аутентификации в&nbsp;данных POST с&nbsp;ключем, хранящимся в&nbsp;данных сессии пользователя. Поэтому, компонент безопасности должен быть включен как&nbsp;в&nbsp;контроллер принимающий запросы, так&nbsp;и&nbsp;в контроллер делающий запросы.<br /> Например, если у&nbsp;меня есть действие в&nbsp;<span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>, которое отображает содержимое формы, переданное методом POST, в&nbsp;действии в&nbsp;<span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a>, тогда компонет безопасности должен быть включен и&nbsp;в <span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a> (который принимает запросы, и&nbsp;в общем-то защищает действие), и&nbsp;в <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> (откуда поступают запросы).<br /> Все&nbsp;время компонент безопасности загружен, даже если он&nbsp;не используется для&nbsp;защиты действий, он&nbsp;делает следующие вещи: сначала, он&nbsp;генерирует ключи аутентификации, используя основной класс Security. Потом, он&nbsp;пишет эти&nbsp;ключи в&nbsp;сессии, вместе с&nbsp;датой окончания действия ключа и&nbsp;некоторой дополнительной информацией (срок действия определяется вашими настройками безопасности сессий в&nbsp;/app/config/core.php). Далее, устанавливает ключ в&nbsp;вашем контроллере, с&nbsp;которым свяжутся позже.<br /> Затем в&nbsp;ваших файлах отображения, любой тег&nbsp;формы, который вы&nbsp;генерируете используя $html-&gt;formTag() будет также содержать невидимое поле с&nbsp;ключем аутентификации. Таким образом, когда из&nbsp;формы данные отправляются (метод POST), компонент безопасности может сравнить это&nbsp;значение со&nbsp;значением в&nbsp;сессии. После этого, ключ аутентификации регенерируется, а&nbsp;сессия обновляется для&nbsp;следующего запроса.</div><br /> <b>Удалено:</b><br /> <div class="deletions">=Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?</div></div> 2008-01-25 22:08:32 /wiki/Manual11/Security/show?time=2008-01-25+22%3A08%3A32 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual11/Security" class="">/Manual&nbsp;11&nbsp;/&nbsp;Security</a> за <a href="/wiki/Manual11/Security?time=2008-01-25+22%3A08%3A32">2008-01-25 22:08:32</a> и <a href="/wiki/Manual11/Security?time=2008-02-01+15%3A50%3A22">2008-02-01 15:50:22</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">=Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&nbsp;не&nbsp;сильно заморачивается на&nbsp;тему какого года одежка, в&nbsp;Спортмастере как&nbsp;обычно можно вырубить прошлогодние доски и&nbsp;некоторую одежду c&nbsp;приятным скидоном в&nbsp;50%. А&nbsp;в дисконтном Спортмастере, который расположен в&nbsp;районе Ленинского проспекта можно затариться катальными куртками и&nbsp;штанами <span class="missingpage">O'&nbsp;Neal</span><a href="/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?</a>, Quiksilver, Nike, Salomon и&nbsp;пр.<br /> Так&nbsp;же&nbsp;там скидоны и&nbsp;на маски, всегда приятно прикупить Oakley с&nbsp;хорошим скидоном, особенно с&nbsp;учетом того, что&nbsp;обычно более <span class="nobr">10&ndash;15</span>% обычно в&nbsp;магазинах ожидать нечего, а&nbsp;здесь максимум вроде 30% на&nbsp;маски, но&nbsp;тем не&nbsp;менее.<br /> P.S. Выбор одежды, масок и&nbsp;досок конечно же&nbsp;не такой огромный как&nbsp;в&nbsp;боардшопах аля&nbsp;НеИгры, Провокатор, Quiksilver и&nbsp;др., коллекции одежды тоже не&nbsp;самое новьё, хотя Quiksilver вроде этого года!?<br /> Вот&nbsp;такая вот&nbsp;инфа, возможно кому-нибудь будет полезной!?</div><br /> <b>Удалено:</b><br /> <div class="deletions"><a name="h40-1"></a><h1>Компонент безопасности</h1> <!--notypo--><fieldset class="table_of_contents"><legend><strong> Оглавление документа </strong></legend><div class="toc1"><a href="#h40-2">Введение</a></div><div class="toc1"><a href="#h40-3">Защита действий контроллера</a></div><div class="toc2"><a href="#h40-4">requirePost</a></div><div class="toc2"><a href="#h40-5">requireAuth</a></div><div class="toc1"><a href="#h40-6">Управление недействительными запросами</a></div><div class="toc1"><a href="#h40-7">Продвинутый запрос аутентификации</a></div></fieldset><!--/notypo--><a name="h40-2"></a><h2>Введение</h2> Компонент безопасности используется для&nbsp;защиты действий вашего контроллера от&nbsp;злоумышленных и&nbsp;неподходящих запросов. Это&nbsp;позволяет вам&nbsp;устанавливать условия, только при&nbsp;выполнении которых можно будет запросить действие, и&nbsp;опционально определить что&nbsp;делать с&nbsp;запросами, которые не&nbsp;удовлетворяют условия. Опять-таки, перед использованием компонента безопасности, вы&nbsp;должны убедиться что&nbsp;'Security' добавлен в&nbsp;масив $components вашего контроллера./p&gt;<a name="h40-3"></a><h2>Защита действий контроллера</h2> Компонент безопасности содержит два&nbsp;основных метода для&nbsp;распределения доступа к&nbsp;действиям контроллера:<a name="h40-4"></a><h3>requirePost</h3> <ul><li> string $action1 </li><li> string $action2 </li><li> string $action3...</li></ul> Для&nbsp;выполнения определенного действия, нужно чтобы оно&nbsp;было запрошено через POST.<a name="h40-5"></a><h3>requireAuth</h3> <ul><li> string $action1 </li><li> string $action2 </li><li> string $action3...</li></ul> Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответсвую, то&nbsp;действию разрешаено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защитить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ атунтификации в&nbsp;Разделе 4 ниже.<br /> Но&nbsp;сначала давайте взглянем на&nbsp;простой пример:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">ThingsController&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">AppController<br /></span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">$components&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'Security'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">beforeFilter</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Security</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">requirePost</span><span style="color: #007700">(</span><span style="color: #DD0000">'delete'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">delete</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Это&nbsp;будет&nbsp;происходить&nbsp;только&nbsp;если&nbsp;действие&nbsp;вызвано&nbsp;через&nbsp;POST<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Thing</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">del</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> Здесь мы&nbsp;говорим компоненту безопасности, что&nbsp;действие 'delete' требует запроса POST. Метод beforeFilter() обычно там&nbsp;где вы&nbsp;хотите сообщить Security (и большинству других компонентов) что&nbsp;делать с&nbsp;самим собой. Он&nbsp;тогда будет делать что&nbsp;сказано сразу после того, как&nbsp;вызван beforeFilter(), но&nbsp;сразу перед тем&nbsp;как вызвано само действие.<br /> Вы&nbsp;можете протестировать это, введя ссылку для&nbsp;действия в&nbsp;браузер и&nbsp;увидете, что&nbsp;произойдет.<a name="h40-6"></a><h2>Управление недействительными запросами</h2> Что&nbsp;ж, если запрос не&nbsp;соответствует требованиям, которые мы&nbsp;определили, что&nbsp;с&nbsp;ним происходит? По&nbsp;умолчанию, запрос пропадает (black-holed), что&nbsp;значит, что&nbsp;клиенту посылается ошибка 404, а&nbsp;приложение сразу же&nbsp;завершает свою работу. Однако, у&nbsp;компонента безопасности есть свойство $blackHoleCallback, в&nbsp;котором вы&nbsp;можете вписать имя&nbsp;своей функции колбека, определенной в&nbsp;вашем контроллере.<br /> Вместо того, чтобы просто выдавать ошибку 404 и&nbsp;потом ничего, это&nbsp;свойство позволяет вам&nbsp;выполнять какие-нибудь дополнительные проверки запроса, переадресовывать запрос в&nbsp;другое мето, или&nbsp;даже записать в&nbsp;лог IP&nbsp;адрес грешащего клиента. Однако, если вы&nbsp;выберете свой колбек, выход из&nbsp;приложения в&nbsp;случае недействительного запроса ложится на&nbsp;вашу совесть. Если ваш&nbsp;колбек возвращает true, тогда компонет безопасности продолжит проверять запрос по&nbsp;другим определенным требованиям. Иначе, проверка останавливается, а&nbsp;ваше приложение продолжает свободно работать.<a name="h40-7"></a><h2>Продвинутый запрос аутентификации</h2> Метод requireAuth() позволяет вам&nbsp;дать максимум деталей при&nbsp;определении как&nbsp;и&nbsp;откуда будет получен доступ к&nbsp;действию, но&nbsp;это происходит с&nbsp;использованием обуславливания, которое становится более ясным, когда вы&nbsp;понимаете как&nbsp;этот метод аутентификации работает. Как&nbsp;начато уже&nbsp;выше, requireAuth() работает сравнением ключа аутентификации в&nbsp;данных POST с&nbsp;ключем, хранящимся в&nbsp;данных сессии пользователя. Поэтому, компонент безопасности должен быть включен как&nbsp;в&nbsp;контроллер принимающий запросы, так&nbsp;и&nbsp;в контроллер делающий запросы.<br /> Например, если у&nbsp;меня есть действие в&nbsp;<span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>, которое отображает содержимое формы, переданное методом POST, в&nbsp;действии в&nbsp;<span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a>, тогда компонет безопасности должен быть включен и&nbsp;в <span class="missingpage">Comments&nbsp;Controller</span><a href="/wiki/CommentsController/edit?add=1" title="Создать эту страницу">?</a> (который принимает запросы, и&nbsp;в общем-то защищает действие), и&nbsp;в <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> (откуда поступают запросы).<br /> Все&nbsp;время компонент безопасности загружен, даже если он&nbsp;не используется для&nbsp;защиты действий, он&nbsp;делает следующие вещи: сначала, он&nbsp;генерирует ключи аутентификации, используя основной класс Security. Потом, он&nbsp;пишет эти&nbsp;ключи в&nbsp;сессии, вместе с&nbsp;датой окончания действия ключа и&nbsp;некоторой дополнительной информацией (срок действия определяется вашими настройками безопасности сессий в&nbsp;/app/config/core.php). Далее, устанавливает ключ в&nbsp;вашем контроллере, с&nbsp;которым свяжутся позже.<br /> Затем в&nbsp;ваших файлах отображения, любой тег&nbsp;формы, который вы&nbsp;генерируете используя $html-&gt;formTag() будет также содержать невидимое поле с&nbsp;ключем аутентификации. Таким образом, когда из&nbsp;формы данные отправляются (метод POST), компонент безопасности может сравнить это&nbsp;значение со&nbsp;значением в&nbsp;сессии. После этого, ключ аутентификации регенерируется, а&nbsp;сессия обновляется для&nbsp;следующего запроса.</div></div> 2007-10-22 20:33:37 /wiki/Manual11/Security/show?time=2007-10-22+20%3A33%3A37 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual11/Security" class="">/Manual&nbsp;11&nbsp;/&nbsp;Security</a> за <a href="/wiki/Manual11/Security?time=2007-10-22+20%3A33%3A37">2007-10-22 20:33:37</a> и <a href="/wiki/Manual11/Security?time=2008-01-25+22%3A08%3A32">2008-01-25 22:08:32</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответсвую, то&nbsp;действию разрешаено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защитить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ атунтификации в&nbsp;Разделе 4 ниже.</div><br /> <b>Удалено:</b><br /> <div class="deletions">Убеждается, что&nbsp;запрос пришел из&nbsp;пределов приложения, проверяя ключ аутентификаци в&nbsp;данных отправленых POST, сравнивая его&nbsp;с&nbsp;ключом аутентификации сохраненной в&nbsp;сессии пользователя. Если они&nbsp;соответсвую, то&nbsp;действию разрешаено выполняться. Имейте ввиду, по&nbsp;причине гибкости, эта&nbsp;проверка запускается только если данные формы были отправлены методом POST. Если же&nbsp;действие вызывается регулярным запросом GET, requireAuth() не&nbsp;будет ничего делать. Для&nbsp;максимальной безопасности вам&nbsp;стоит использовать requirePost() и&nbsp;requireAuth() на&nbsp;действиях, которые вы&nbsp;хотите полностью защетить. Подробнее о&nbsp;том, как&nbsp;генерируется ключ атунтификации в&nbsp;Разделе 4 ниже.</div></div>