После того как наигрались с Revel и поняли что это за чудик, пора учиться готовить его к production в части безопасности. Данная заметка вполне может использоваться в любом веб-приложении, но рассказывать буду на примере простого приложения на Revel.
Вообщем суть проблемы заключается в том, что существует класс атак в Интернете именуемые Cross-Site Request Forgery (сокр. CSRF). Если вы не знакомы с ними, то просьба обратить свое внимание. Приведу небольшую выдержку из Вики:
CSRF — вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. Если жертва заходит на сайт, созданный злоумышленником, от её лица тайно отправляется запрос на другой сервер (например, на сервер платёжной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счёт злоумышленника). Для осуществления данной атаки жертва должна быть аутентифицирована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.
CsrfFilter enables CSRF request token creation and verification.
Usage:
1) Add `csrf.CsrfFilter` to the app's filters (it must come after the revel.SessionFilter).
2) Add CSRF fields to a form with the template tag `{{ csrftoken. }}`. The filter adds a function closure to the `RenderArgs` that can pull out the secret and make the token as-needed, caching the value in the request. Ajax support provided through the `X-CSRFToken` header.
go get github.com/cbonello/revel-csrf
import (
"github.com/cbonello/revel-csrf"
"github.com/revel/revel"
)
func init() {
// Filters is the default set of global filters.
revel.Filters = []revel.Filter{
...
revel.SessionFilter, // Restore and write the session cookie.
revel.FlashFilter, // Restore and write the flash cookie.
HeaderFilter, // Add some security based headers
csrf.CSRFFilter, // CSRF prevention. <----------------------------
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
...
}
...
}
<form id="login-form" class="form-vertical" action="{{url "App.ConfirmLogin"}}" method="post">
<input type="hidden" name="csrf_token" value="{{.csrf_token }}">
...
</form>
POST /logout App.Logout
$ bower install jquery-ujs --save
<!DOCTYPE html>
<html lang="ru">
<head>
...
<meta name="csrf-token" content="{{.csrf_token}}">
<meta name="csrf-param" content="csrf_token">
...
</head>
...
csrf.ajax = true
csrf.token.length = 64
<a href="{{url "App.Logout"}}" data-method="post">Выход</a>
К сожалению, не доступен сервер mySQL