58 lines
4.9 KiB
Markdown
58 lines
4.9 KiB
Markdown
---
|
||
title: Cross Site Request Forgery
|
||
localeTitle: Подделка запросов на межсайтовый запрос
|
||
---
|
||
## Подделка запросов на межсайтовый запрос
|
||
|
||
Cross-Site Request Forgery - это уязвимость в приложении, вызванная тем, что программист не проверяет, куда был отправлен запрос, - эта атака отправляется пользователю с высоким уровнем привилегий для доступа к приложению более высокого уровня.
|
||
|
||
### Пример кросс-сайта
|
||
|
||
Онлайновый блог позволяет пользователям отправлять комментарии и включать изображение в комментарий, панель администратора блога позволяет автору блога удалять комментарий, загружая URL `/admin/deletecomment.php?id=123` . Злоумышленник может создать тег изображения, который загружает URL-адрес комментария удаления, например, `<img src="/admin/deletecomment.php?id=123" />` поэтому в следующий раз, когда администратор просмотрит комментарий, компьютер администратора загрузит URL-адрес и удалите номер комментария 123.
|
||
|
||
### Защита вашего сайта от атак на подделку запросов на PHP
|
||
|
||
Чтобы защититься от атаки подделки с запросами на кросс-сайт, вы должны проверить против регулярно измененного токена. URL `/admin/deletecomment.php?id=123` изменится на `/admin/deletecomment.php?id=123&csrf-token=random-per-user-unique-string-here` .
|
||
|
||
```PHP
|
||
<?php
|
||
// Checking a request's CSRF Token (if true the comment is deleted, if false the comment remains.)
|
||
session_start();
|
||
if ($_GET['csrf-token'] == $_SESSION['csrf-token']){
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
```
|
||
|
||
**Подсказки:**
|
||
|
||
* Храните токен CSRF полностью случайным и изменяйте за сеанс (функции openssl могут помочь с этим)
|
||
* Сеансы PHP полезны для хранения токена CSRF, доступного как для пользователя, так и для сервера, вы также можете сделать эту базу данных процессов управляемой, если вы так склонны.
|
||
* Измените токен CSRF на сеанс каждые 24 часа. В случае приложения с высоким уровнем риска вы можете изменить его при каждом успешном запросе, однако это вызовет проблемы с пользователями, использующими несколько вкладок.
|
||
|
||
#### Безопасное создание токена
|
||
|
||
При установке токена CSRF важно, чтобы невозможно угадать ключ. Функции OpenSSL в PHP могут генерировать рандомизированный ключ для вас и хранить в качестве переменной сеанса.
|
||
|
||
```PHP
|
||
<?php
|
||
session_start();
|
||
$_SESSION['csrf-token'] = bin2hex(openssl_random_pseudo_bytes(16));
|
||
```
|
||
|
||
#### Использование токена CSRF для выполнения законных запросов
|
||
|
||
Вы можете включить переменную сеанса, сохраненную ранее с вашим токеном CSRF в URL-адресе, убедиться, что законному администратору разрешено удалять комментарии. Без правильного токена запрос будет заблокирован.
|
||
|
||
```PHP
|
||
<?php
|
||
session_start();
|
||
echo '<a href="/admin/?id=123&csrf-token='.$_SESSION['csrf-token'].'">Delete Comment</a>'; // Only the logged in user has access to the CSRF Token - the token isn't accessible to the attacker preventing their attack from being successful.
|
||
```
|
||
|
||
#### Дополнительная информация:
|
||
|
||
* [OWASP Wiki - Подделка запросов на межсайтовый запрос](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF))
|
||
* [Руководство пользователя php.net bin2hex ()](https://secure.php.net/manual/en/function.bin2hex.php)
|
||
* [Руководство пользователя php.net openssl\_random\_pseudo\_bytes ()](https://secure.php.net/manual/en/function.openssl-random-pseudo-bytes.php) |