Как добавить защиту от подделки CSRF в формы
Что такое CSRF-атака?
Атака на подделку межсайтовых запросов (CSRF) основана на доверии веб-сайта к пользователю для выполнения несанкционированных запросов и/или транзакций. Например, предположим, что пользователь вошел в свой Joomla! интерфейс администратора веб-сайтов на одной вкладке и просматривает скомпрометированный сайт на другой вкладке. Простая CSRF-атака может быть запущена просто путем изменения элементов IMG в некоторых браузерах, чтобы они указывали на что-то вроде
http://some/joomla/site/administrator/index2.php?option=com_users&task=delete...
Когда пользователь просматривает скомпрометированный сайт, это изображение будет запрошено, и поскольку пользователь в настоящее время вошел в интерфейс администратора своего Joomla! сайте, поддельный запрос будет положительно аутентифицирован и выполнен. Чтобы предотвратить простые CSRF-атаки, подобные описанной выше, токены запросов были добавлены ко всем формам во интерфейсной и серверной части Joomla! интерфейсы. Токены представляют собой рандомизированные строки, которые используются для проверки того, что выполняемый запрос поступает из действительной формы и действительного сеанса. Эта простая мера очень эффективна для предотвращения большого процента потенциальных CSRF-атак, однако из-за природы CSRF их чрезвычайно трудно, если не невозможно, полностью обезопасить.
Защита От CSRF-Атак.
Joomla! пытается защитить от CSRF путем вставки случайной строки, называемой токеном, в каждую форму POST и в каждую строку запроса GET, которая может что-то изменить в Joomla! система. Эта случайная строка обеспечивает защиту, поскольку скомпрометированному сайту необходимо не только знать URL целевого сайта и допустимый формат запроса для целевого сайта, но и знать случайную строку, которая изменяется для каждого сеанса и каждого пользователя.
В Joomla! Фреймворк позволяет вам легко включать такую защиту и в ваши компоненты. Это просто реализовать как в запросах POST, так и в запросах GET.
POST-запрос.
Запросы POST отправляются в формате HTML с использованием форм. Чтобы добавить токен в свою форму, добавьте следующую строку внутри своей формы:
<?php echo JHtml::_( 'form.token' ); ?>
В Joomla 4
use Joomla\CMS\HTML\HTMLHelper; <?php echo HTMLHelper::_('form.token'); ?>
Это приведет к выводу чего-то вроде следующего:
<input type="hidden" name="1234567890abcdef1234567890abcdef" value="1" />
GET-запрос.
Запросы GET отправляются в формате HTML с использованием строк запроса. Чтобы добавить токен в строку запроса, используйте URL-адрес, например:
<?php echo JRoute::_( 'index.php?option=com_example&controller=object1&task=save&'. JSession::getFormToken() .'=1' ); ?>
В Joomla 4.
use Joomla\CMS\Router\Route; use Joomla\CMS\Session\Session; <?php echo Route::_( 'index.php?option=com_example&controller=object1&task=save&'. Session::getFormToken() .'=1' ); ?>
Это сгенерирует URL-адрес с токеном в строке запроса.
Проверка токена.
После того, как вы включили токен в свою форму или в строку запроса, вы должны проверить токен, прежде чем ваш скрипт выполнит запрос. Это делается с помощью следующей строки:
JSession::checkToken() or die( 'Invalid Token' );
В Joomla 4.
$this->checkToken();
Если запрос поступает из строки запроса, вы должны указать это. Код становится:
JSession::checkToken( 'get' ) or die( 'Invalid Token' );
В Joomla 4.
$this->checkToken();
Рекомендуемые Процедуры Обеспечения Безопасности.
Хотя эти методы помогают предотвратить подобные типы атак, важно понимать, что как системный администратор необходимо соблюдать правила безопасности, которые предотвратят компрометацию сайта.
- Не просматривайте другие сайты в том же браузере, пока вы вошли на свой сайт.
- Выйдите из своего сайта после того, как вы закончите.
- Не оставайтесь на своем сайте, пока вы ничего не делаете.
- Убедитесь, что адрес в строке браузера совпадает с адресом вашего сайта.
Практикуя эти безопасные привычки серфинга, вы устраните большинство угроз для вашего веб-сайта.
Оригинал статьи: https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms