Я специально проверяю сеанс пользователя перед принятием POST
Если вы имеете в виду то, что обычно подразумевается под «сессией»: постоянный токен, хранящийся в файле cookie, который идентифицирует пользователя и связанные с ним данные сеанса, то нет, этого недостаточно. Этот файл cookie автоматически отправляется браузером, даже если запрос POST был спровоцирован другим (атакующим) сайтом.
Ключевое слово, которое вы ищете здесь - это подделка межсайтовых запросов или XSRF , где злоумышленник может сделать аутентифицированного пользователя (с помощью сценариев или других методов), чтобы сделать запрос GET или POST твой сайт. Такие запросы обычно не отличаются от законных запросов. (Некоторые люди пытаются это сделать, проверяя данные HTTP-реферера, но это ненадежно.)
Эти атаки не так быстро наносят ущерб, как инъекции на стороне сервера (SQL, команда) или на стороне клиента (HTML, JavaScript), но они встречаются чаще, чем оба: к сожалению, немногие веб-программисты включают надлежащие контрмеры , Пока их сайты не будут скомпрометированы дырой XSRF.
Существуют различные способы защиты от XSRF, но единственный действительно эффективный подход - включить в каждую отправляемую форму секретное значение, которое сторонний злоумышленник не узнает. Это часто называют почтовым ключом, как упомянул Eimantas.
Существуют различные способы получения такой секретной информации. Простой подход - добавить случайно сгенерированный код к деталям учетной записи каждого пользователя, затем поместить его в скрытое поле в форме и проверить его наличие в представлении. например, в PHP:
<form method="post" action="delete.php"><div>
<input type="hidden" name="key" value="<?php echo(htmlspecialchars($user['key'])); ?>"/>
<input type="submit" value="Delete" />
</div></form>
if ($_POST['key']!=$user['key'])
// error
Злоумышленник не знает ключ для этого пользователя, поэтому не может создать ссылку / форму, которая его содержит.
Вы также можете использовать криптографическую хеш-функцию для идентификатора пользователя с секретным ключом сервера вместо хранения отдельного кода. С помощью хэша вы также можете добавить другие данные, например, срок действия, чтобы формы отправлялись в течение определенного периода времени. Или вы можете сгенерировать одноразовый ключ транзакции, который также можно использовать, чтобы убедиться, что вы не можете отправить одну и ту же форму дважды (для прекращения двойной публикации).