0

我有一个简单的 rails 网页,用户在其中输入几个文本字段并上传图片。然后 Rails 存储图片并更新服务器上的数据库。它工作正常。

但是,我还需要另一台计算机上的脚本来偶尔使用 curl/curb 库更新网页。但是,当我尝试这样做时,出现此错误:

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”的东西。有没有办法解决?也许制作另一个网页做同样的事情,但只是为了我的遏制脚本?

4

2 回答 2

3

隐藏的输入是为了防止Cross-Site Request Forgeryauthenticity_token如果没有首先获取表单并提取隐藏参数,您将无法发布到受到如此保护的 rails 操作。curl 不够聪明,无法自行完成此操作。

你有两个选择:

  1. protect_from_forgery通过从控制器中删除调用来关闭 CSRF 保护。馊主意。
  2. 运行一个请求以获取表单,使用快速而肮脏的正则表达式来获取参数,例如

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

    然后运行另一个发布该值的请求authenticity_token。它很脆弱,可能会让人们讨厌你,但它会起作用。

  3. 使用比curl对表单和连续提交提出必要请求更复杂的方法。 机械化似乎是事实上的标准。
于 2012-04-30T09:45:48.477 回答
1

如何使用机械化提交表单:

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