web-dev-qa-db-ja.com

拡張Drupal 6 "form_token"& "form_build_id"

コマンドラインを使用して自分のWebサイトに投稿しています。

以下のコードは私にとってはうまくいきます

curl -b cookies.txt -d title="$(my-own-sed-command)" -d taxonomy%5Btags%5D%5B1%5D="$(my-own-sed-command)" -d teaser_include=1 -d body="$(my-own-sed-command)" -d field_source%5B0%5D%5Burl%5D="$(my-own-sed-command)" -d changed= -d form_build_id=form-2bef00e4e4c6c53c1cedfc61e857186b -d form_token=883b4e7f69cdd1bf3311854732eff3f7 -d form_id=post_node_form -d op=Save http://www.mywebsite.com/node/add/post

通常、上記のコマンドを使用して1日に数回投稿します。しかし問題は;いつか2、3日休みます。 2〜3日後に、「form_token」と「form_build_id」の有効期限が切れました。

期限切れを防ぐために、「form_token」と「form_build_id」を7日間に延長する方法を教えてください。

どんな方法でも大歓迎です。コアのハッキング、このノードタイプ送信のトークンの無効化など。

1
minyak moto

TL; DR:これらの値は、

  • 同じユーザーを使用してサイトにログインする
  • PHPセッションは期限切れではありません
  • Drupalは、キャッシュ内で「form_build_id」に関連付けられたフォーム配列を見つけます。

「form_token」に使用されるトークンは、次の関数呼び出しで使用して作成されたものです。drupal_get_token($form['#token']);同じ形式で、その関数呼び出しで変更される唯一の値は、session_id()から呼び出されるdrupal_get_token()です。

function drupal_get_token($value = '') {
  $private_key = drupal_get_private_key();
  return md5(session_id() . $value . $private_key);
}

drupal_get_private_key()から返される値は、各Drupalサイトで一意です。これを変更する唯一の方法は、Drupal変数 "drupal_private_keyを削除することです。 "削除されることはありません(それを削除するサードパーティのモジュールがない場合)が、Drupalがインストールされると初期化されます。session_id()によって返される値はログインしているユーザーが同じで、PHPセッションがまだ期限切れになっていない場合、drupal_get_token()が呼び出されるたびに同じです。

「form_build_id」の値については、その値は完全にランダムで、次のコードを使用して drupal_prepare_form() から初期化されます。

  if (isset($form['#build_id'])) {
    $form['form_build_id'] = array(
      '#type' => 'hidden', 
      '#value' => $form['#build_id'], 
      '#id' => $form['#build_id'], 
      '#name' => 'form_build_id',
    );
  }

$form['#build_id']drupal_get_form() の次のコードから初期化されます。

  $form_build_id = 'form-' . md5(uniqid(mt_Rand(), TRUE));
  $form['#build_id'] = $form_build_id;

「form_build_id」と「form_id」の値をPOSTデータで渡すと、次のコードが実行されます( drupal_get_form() を参照):

if (isset($_POST['form_id']) && $_POST['form_id'] == $form_id && !empty($_POST['form_build_id'])) {
  $form = form_get_cache($_POST['form_build_id'], $form_state);
}

キャッシュにフォームが含まれている場合、「form_build_id」は再度生成されません。

4
kiamlaluno