微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails-3 – Paperclip宝石触发CSRF令牌验证问题

我有一个使用回形针宝石(3.4版)的Rails 3.1应用程序.简而言之.我有一个故事模型和一个后期模型.一个故事可以有很多帖子.
#story.rb

class Story < ActiveRecord::Base

  attr_accessible :title,:user_id,:username,:posts_attributes

  belongs_to    :user
  has_many      :posts,:dependent  =>  :destroy,:order => "created_at DESC"

  accepts_nested_attributes_for :posts,:reject_if => lambda { |t| t['contents'].nil? }

end
#post.rb

class Post < ActiveRecord::Base

  attr_accessible :contents,:photo,:dimensions

  belongs_to    :story,:touch => true
  belongs_to    :user,:touch => true

  has_attached_file :photo,:styles => { 
                      :medium => { :geometry => "400x400>" },:thumb => { :geometry => "100x100>" },},:processors => [:thumbnail],:storage => :s3,:s3_credentials => "#{Rails.root.to_s}/config/s3.yml",:path => "/:style/:id/:filename"


  before_save   :extract_dimensions

  serialize   :dimensions

  validates   :contents,:presence   => true,:length         => {  :maximum => 399,:minimum => 5 } 
  validates   :user_id,:presence => true

  validates_attachment_content_type :photo,:content_type => ['image/jpeg','image/png','image/gif','image/jpg'],:message => "Sorry,we don't support that type of image format"

end

如您所见,帖子可能附有照片附件.我使用回形针来管理这些附件.

生成使用javascript / jquery在客户端上动态发布这些帖子的表单.我的问题是这个. . .如果帖子不包含照片附件,一切都可以完美. IF,但是,如果POST有照片附件,我收到以下错误消息,该帖子不POST:

WARNING: Can't verify CSRF token authenticity
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 61 LIMIT 1
   (0.3ms)  BEGIN
   (0.2ms)  COMMIT
Completed 401 Unauthorized in 238ms

结果,我的会话数据被破坏,我甚至不能看到与Firebug的请求头. put请求根本不会出现在firebug中.

现在,毫不奇怪,我可以在PostController中解决以下问题:

skip_before_filter :verify_authenticity_token,:only => [:create]

但我不想放弃这种安全.我也尝试通过js / jquery将CSRF头添加到我的表单中:

jQuery.ajaxSetup({ 
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token',$('Meta[name="csrf-          
            token"]').attr('content'));
  }
});

但是这并不能解决问题,正如我上面所说的,我甚至看不到请求头数据来看头.

任何人都可以看出纸夹是否触发问题的原因?

解决方法

我知道,自从我第一次发布上述问题以来,已经有一段时间了,但是人们仍然在搜索中找到它,所以我以为我会用一个答案来更新.

上面讨论的问题与Paperclip无关.由于我使用的是remotipart.js来处理提交具有文件附件的表单,因此该表单正在提交而无需使用csrf令牌. Remotipart通过将表单数据复制到i框架中,使表单类似于ajax,从而在您的站点保持活动状态时提供正常的(即非ajax)提交.有关通过i-frame进行的ajax文件上传的更详细的描述,请参见this article.

在以前的remotipart版本中,csrf令牌未被复制到i-frame提交的表单中.支持远程的好人现在已经解决了这个缺点.你可以找到修复here

原文地址:https://www.jb51.cc/ruby/266742.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐