web-dev-qa-db-ja.com

anonユーザー向けのモジュールフォームのCSRF

私のモジュールには、訪問者が特定の情報を送信できる2つの小さなフォームがあります。

ログインしていないときに問題が発生し、フォームにCSRFトークンが追加されないため、匿名ユーザー/全員がCSRFをバイパスしています。この問題に関するドキュメントが見つかりません。CSRFトークンを取得できるように、誰かが私を正しい方向に向けることができますか?

すべてのフォームにCSRFが含まれていることが、私のセキュリティテストの要件です。

1
Graeme

drupal_prepare_form() を見ると、

トークンはセッションにバインドされており、匿名ユーザーに表示されるフォームはキャッシュされる可能性が高いため、トークンを割り当てることはできません。

これを続行したい場合は、デフォルトの検索フォームとコメントフォームですばやくテストすると、次のようになります。

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if (!isset($form['#token'])) {
    $form['#token'] = $form_id;
    $form['form_token'] = array(
      '#id' => drupal_html_id('edit-' . $form_id . '-form-token'), 
      '#type' => 'token', 
      '#default_value' => drupal_get_token($form['#token']),
    );
  }
}

ただし、この道を進む場合は、ページキャッシュ(および使用する場合はリバースプロキシ)に注意してください。

2
Andy