首页 / 帖子
如何给模板中自定义的一form表单添加formtoken并在提交的action方法中验证token值有效?

先申明一下, 这里的form不是用数组生成的。就是手写的一个纯天然的form表单。我另外定义了一个action的page去处理这个业务。想在这个表单中加一个token验证,我测试可以用drupal_get_token()生成一个token值,但不知道如何验证?试用过drupal_valid_token
,但总是返回 false.请问一下大家,谢谢。


1个答案
赵高欣
发布于:2015-09-21 09:13

截取下drupal_prepare_form里的代码

$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']),
  // Form processing and validation requires this value, so ensure the
  // submitted form value appears literally, regardless of custom #tree
  // and #parents being set elsewhere.
  '#parents' => array('form_token'),
);

以及drupal_validate_form的代码

if (isset($form['#token'])) {
  if (!drupal_valid_token($form_state['values']['form_token'], $form['#token'])) {
    $path = current_path();
    $query = drupal_get_query_parameters();
    $url = url($path, array('query' => $query));
    // Setting this error will cause the form to fail validation.
    form_set_error('form_token', t('The form has become outdated. Copy any unsaved work in the form below and then <a href="@link">reload this page</a>.', array('@link' => $url)));
    // Stop here and don't run any further validation handlers, because they
    // could invoke non-safe operations which opens the door for CSRF
    // vulnerabilities.
    $validated_forms[$form_id] = TRUE;
    return;
  }
}

若总是返回false,可能要检查下session_id是否一致,drupal_get_token会用session_id去生成token