0

ユーザーがいくつかのテキストフィールドに入力して画像をアップロードする単純なレールのWebページがあります。次に、Railsは画像を保存し、サーバー上のデータベースを更新します。正常に動作します。

ただし、curl / curbライブラリを使用してWebページをときどき更新するには、別のコンピューターにスクリプトが必要です。ただし、これを実行しようとすると、次のエラーが発生します。

ActionController :: InvalidAuthenticityToken(ActionController :: InvalidAuthenticityToken)

よく見ると、Railsはフォームを作成するたびに「authenticity_token」という非表示のフィールドを配置しているようです。

<form action="/headshots/single" enctype="multipart/form-data" method="post">
<input name="authenticity_token" type="hidden" value="798b514826513c881613a0c18b52839489a12181" />
. . .
</form>

「authenticity_token」がないため、curbスクリプトは機能しません。これを回避する方法はありますか?たぶん、同じことをする別のWebページを作成しますが、私の縁石スクリプトのためだけですか?

4

2 に答える 2

3

隠された入力は、クロスサイトリクエストフォージェリを防ぐためにあります。authenticity_token最初にフォームを取得して非表示のパラメーターを抽出しない限り、保護されているRailsアクションに投稿することはできません。カールはそれ自体でこれを行うのに十分賢いわけではありません。

2つのオプションがあります。

  1. コントローラからへの呼び出しを削除して、CSRF保護をオフにprotect_from_forgeryします。悪いアイデア。
  2. フォームを取得するために1つのリクエストを実行し、パレメーターを取得するために手っ取り早い正規表現を使用します。

    /name="authenticity_token".*value="([^"]+)"/

    and then run another request posting that value for authenticity_token. It's brittle and it might make people hate you but it will work.

  3. Use something more sophisticated than curl to make the necessary request for the form and the successive submission. Mechanize appears to be the de facto standard.
于 2012-04-30T09:45:48.477 に答える
1

How to submit a form with mechanize:

Mechanize.new.get('url_with_form').forms[0].tap{|f| f.field = 'value'}.submit
于 2012-04-30T10:20:42.883 に答える