読者です 読者をやめる 読者になる 読者になる

babie steps

作業療法記録

link_to ... :method => :delete のCSRF

rails

Rails 1.2 までの link_to って、:method => :delete の時、CSRF の危険があるよね。なもんで、security_extension プラグインを入れた上で、app/helper/application.rb に、

  def delete_link_to(str, options = {}, html_options = nil, *parameters_for_method_reference)
    %Q|<a onclick="if (confirm('#{html_options[:confirm]}')) {
      var f = document.createElement('form');
      f.style.display = 'none';
      this.parentNode.appendChild(f);
      f.method = 'POST';
      f.action = this.href;
      var s = document.createElement('input');
      s.setAttribute('type', 'hidden');
      s.setAttribute('name', 'session_id_validation');
      s.setAttribute('value', '#{security_token}');
      f.appendChild(s);
      f.submit();
    };
    return false;"
    href="#{url_for(options)}">#{str}</a>|
  end

なんてコードを書いて使って対処していたんだけど、Rails2.0 PR のコード見たらちゃんと対策されたコードが入っていた。エロイ。actionpack/lib/action_controller/request_forgery_protection.rb あたり。