Если настройки форума разрешают постинг без регистрации, и незарегистрированный пользователь пытается сделать пост при отключенных javascript-ах, появляется "Ошибка отправки формы".
Мне удалось выяснить, что ошибка, по-видимому, связана с проверкой
form_token
. Если пользователь не зарегистрирован и JS отключен, то form_token
и creation_time
оба отправляются на сервер со значением "0"
, и запрос на сервере отбраковывается.Вот соответствующий фрагмент кода из
styles/prosilver/template/posting_layout.html
:- Код: Выделить всё
<!-- IF S_USER_LOGGED_IN -->
{S_FORM_TOKEN}
<!-- ELSE -->
<input type="hidden" name="creation_time" value="0" />
<input type="hidden" name="form_token" value="0" />
<script type="text/javascript">
jQuery(function($)
{
$('#postform').submit(function()
{
$('inp'+'ut[na'+'me=crea'+'tion_t'+'ime]').val('{RAW_CREATION_TIME}');
$('in'+'pu'+'t[name'+'=for'+'m_to'+'ken]').val('{RAW_FORM_TOKEN}');
});
});
</script>
<!-- ENDIF -->
Как видно, для незарегистрированных пользователей оба поля выставляются javascript-ом при отправке формы.
Цель данного трюка в том, чтобы анонимный бот не смог выцепить правильные значения, распарсив страницу, что, в общем, понятно. Не понятно другое: зачем боту понадобится это делать...
Если я правильно понимаю,
form_token
призван защищать пользователя от Cross-Site Request Forgery (CSRF) Attack. Но эта атака направлена именно на зарегистрированных пользователей ресурса (cookie пользователя используются для совершения действия от его имени). Если пользователь не залогинен, атака не имеет смысла. И если мы отдадим анонимному боту форму с заполненным токеном для анонимного пользователя, он не сможет использовать этот токен для атаки зарегистрированного пользователя (токен не совпадёт).Таким образом, по-моему, трюк с выставлением полей javascript-ом не приносит пользы, но только мешает, ибо без JS форма не работает. Может быть, имеет смысл его убрать?
Если я что-то неправильно понял, будет здорово, если вы мне объясните. Заранее спасибо.
P.S.
Такая же проблема существует при регистрации нового пользователя. Без javascript это невозможно сделать.