标签: ruby-on-rails-5

Rails 5.0.0.beta1 - 从非清理的请求参数生成URL是不安全的

我们正在从Rails 4.2.5升级到5.0.0.beta1

在测试时,我们希望看到像以前一样使用分页链接呈现的索引视图.但是我们现在得到一个ArgumentError错误页面,例如:

ArgumentError in Transactions#index 
/app/views/kaminari/_paginator.html.erb where line #10 raised:


<%= paginator.render do -%>

Generating an URL from non sanitized request parameters is insecure!

Application Trace | Framework Trace | Full Trace

app/views/kaminari/_paginator.html.erb:10:in block in _app_views_kaminari__paginator_html_erb___4026289994022119719_69904100316060' app/views/kaminari/_paginator.html.erb:9:in_app_views_kaminari__paginator_html_erb___4026289994022119719_69904100316060'
app/views/transactions/index.html.erb:2:in `_app_views_transactions_index_html_erb__422882858554400818_60602560'
Run Code Online (Sandbox Code Playgroud)

kaminari提出了一个问题

进一步研究这里是新的Rails 5.0.0.beta1代码,现在抛出错误: ActionPack的/ lib目录/ action_dispatch /路由/ url_for.rb

将它添加到config/application.rb'修复'它,但不是一个好主意:

config.action_controller.permit_all_parameters = true
Run Code Online (Sandbox Code Playgroud)

而是添加这个并不能解决问题,不确定原因:

config.action_controller.always_permitted_parameters =  [:current_page, :page, :total_pages, :per_page, :remote, :paginator]
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails upgrade sanitize kaminari ruby-on-rails-5

17
推荐指数
1
解决办法
3543
查看次数

从iOS应用程序连接到ActionCable

我整天都被困在这一天.我有David Heinemeier Hansson工作正常的非常简单的ActionCable示例应用程序(聊天应用程序)(https://www.youtube.com/watch?v=n0WUjGkDFS0).

我试图用iPhone应用程序点击websocket连接.我连接时能够接收ping ws://localhost:3000/cable,但我不太确定如何从javascript上下文之外订阅频道.

ruby-on-rails websocket ruby-on-rails-5 actioncable

17
推荐指数
2
解决办法
5467
查看次数

Rails - 验证:如果一个条件为真

在Rails上5.

我有一个Order带有description属性的模型.如果满足以下两个条件之一,我只想验证它的存在:如果当前步骤等于第一步或者如果require_validation等于true.

我可以根据以下一个条件轻松验证:

validates :description, presence: true, if: :first_step?

def first_step?
 current_step == steps.first
end
Run Code Online (Sandbox Code Playgroud)

但我不知道如何添加另一个条件并验证其中一个是否属实.

就像是:

validates :description, presence: true, if: :first_step? || :require_validation
Run Code Online (Sandbox Code Playgroud)

谢谢!

validation ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

17
推荐指数
2
解决办法
2万
查看次数

缺少'生产'环境的secret_key_base,

我简直无法通过这条消息

缺少secret_key_base'生产'环境,设置此字符串为rails credentials:edit(ArgumentError)

我这里有rails 5.2.0.跑来跑去EDITOR=vim rails credentials:edit:

production:
   secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

保存,并在终端: RAILS_ENV=production rails c

我错过了什么吗?我重新启动了服务器和同样的问题.在开发模式中没有问题.

ruby-on-rails ruby-on-rails-5 ruby-on-rails-5.2

17
推荐指数
5
解决办法
2万
查看次数

将auth_token发送给ActionCable进行身份验证

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      #puts params[:auth_token]
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', current_user.name
   end

  end
end
Run Code Online (Sandbox Code Playgroud)

我不使用web作为动作电缆的终点,所以我想使用auth_token进行身份验证.默认情况下,操作电缆使用会话用户标识进行验证 如何通过params连接方法?

ruby-on-rails-5 actioncable

16
推荐指数
4
解决办法
7400
查看次数

Rails 5中未允许的参数

首先,我想简单地在我发送给我的当前对象中获取一个对象back-end.

我有这个简单的JSON(从表单生成):

{
  "name": "Project 1",
  "project_criteria": [
    {
      "name": "Criterium 1",
      "type": "Type 1",
      "benefit": "1"
    },
    {
      "name": "Criterium 2",
      "type": "Type 2",
      "benefit": "3"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的classes:

class Project < ApplicationRecord
    has_many :project_criteria
    accepts_nested_attributes_for :project_criteria
end

class ProjectCriterium < ApplicationRecord
    belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)

ProjectsController:

def project_params
    params.require(:project).permit(:name,  project_criteria: [] )
end
Run Code Online (Sandbox Code Playgroud)

但我仍然无法访问project_criteria参数,如下所示:

Started POST "/projects" for 127.0.0.1 at 2016-08-19 16:24:03 -0300
Processing by ProjectsController#create as HTML
  Parameters: {"project"=>{"name"=>"Project …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails ruby-on-rails-5

16
推荐指数
2
解决办法
2万
查看次数

ActionCable - 无法在生产中升级到WebSocket

ActionCable在生产中不起作用.适用于开发,但不适用于生产.

在Ubuntu 14.04上使用Puma运行Nginx.我已经检查过redis-server已启动并正在运行.

Rails -v 5.0.0.1

production.log:

INFO -- : Started GET "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
INFO -- : Finished "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
Run Code Online (Sandbox Code Playgroud)

客户要求:

GET ws://mityakoval.com/cable HTTP/1.1
Host: mityakoval.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://mityakoval.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept-Encoding: gzip, deflate, …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails nginx ruby-on-rails-5 actioncable

16
推荐指数
4
解决办法
9277
查看次数

Rails 5 SQL注入

我已经在一段时间内阅读了关于各种SO线程,指南等的内容......但所有答案都是矛盾和矛盾的.

似乎有很多类似的方法,很多答案都说使用不同的方法.

  • sanitize
  • sanitize_conditions
  • sanitize_sql
  • sanitize_sql_array
  • sanitize_sql_for_assignment
  • sanitize_sql_for_conditions
  • sanitize_sql_hash
  • sanitize_sql_hash_for_assignment
  • sanitize_sql_hash_for_conditions
  • sanitize_sql_like

我正在尝试编写一个"原始查询"适配器,它允许我运行原始的Postgres查询,但允许我插入来自危险用户输入的我自己的参数.

我不能在这几个实例中使用AR,因为我正在进行复杂的纬度/经度计算,聚合函数,复杂子查询等.

到目前为止,我尝试了两种方法:

方法1

对于这种方法,我不知道是否sanitize是上述的最佳选择,或者它是否适用于100%的情况......(我只使用Postgres)

class RawQuery

  def exec(prepared, *params)
    prepared = query.dup
    params.flatten.each_with_index do |p, i|
      prepared.gsub!("$#{i + 1}", ActiveRecord::Base.sanitize(p))
    end
    ActiveRecord::Base.connection.exec_query(prepared)
  end

end
Run Code Online (Sandbox Code Playgroud)

琐碎的用法示例(当然通常不会这么简单,或者我只会使用AR):

RawQuery.new.exec('SELECT * FROM users WHERE name = $1', params[:name])

此外,它似乎sanitize代表quote.但根据这篇SO帖子说它只是用单引号包装东西并不安全......所以我不知道.

方法2

我不确定这是否同样安全,但它似乎使用了一个实际的PG准备功能(我假设它是100%安全的).唯一的问题是rails不会将其打印到控制台,也不包括SQL执行时间(这会破坏我的分析工具).

class RawQuery

  def prepare(query, *params)
    name = "raw_query_#{SecureRandom.uuid.gsub('-', '')}"
    connection = ActiveRecord::Base.connection.raw_connection
    connection.prepare(name, query)
    connection.exec_prepared(name, params)
  end

end
Run Code Online (Sandbox Code Playgroud)

使用方式相同:

RawQuery.new.prepare('SELECT * FROM …

ruby postgresql activerecord ruby-on-rails ruby-on-rails-5

16
推荐指数
1
解决办法
3556
查看次数

Heroku安装Bundler然后抛出错误Bundler 2.0.1

我正在尝试将Rails应用程序部署到Heroku。自从我在那里部署任何东西已经有一段时间了,但是我对这里发生的事情一无所知。

这是一个相当基本的Rails 5应用程序。部署顺利通过Gemfile,然后失败,并出现错误,要求我安装Bundler v 2.0.1。这是日志的有趣之处:

remote:        Fetching devise 4.6.2
remote:        Installing sass-rails 5.0.7
remote:        Installing devise 4.6.2
remote:        Bundle complete! 26 Gemfile dependencies, 78 gems now installed.
remote:        Gems in the groups development and test were not installed.
remote:        Bundled gems are installed into `./vendor/bundle`
remote:        Post-install message from i18n:
remote:        
remote:        HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
remote:        But that may break your application.
remote:        
remote:        Please check your Rails app for 'config.i18n.fallbacks = true'. …
Run Code Online (Sandbox Code Playgroud)

heroku bundler ruby-on-rails-5

16
推荐指数
2
解决办法
2938
查看次数

Rails 5:表单如何使用自定义HTTP标头提交?

我似乎无法找到任何有关如何在Rails 5中使用自定义标头提交webform的信息.我希望我发送PUT请求的URL也会收到一些自定义标头.我很惊讶form_for没有争论.

我可以通过将表单提交到我在那里修改标题的操作来完成此操作,例如,request.headers['my-header'] = 'xyz'.然后我必须PUT在这个"中间"控制器动作中提出请求,我觉得这个额外的步骤是笨重和非常规的.

我也可以使用jQuery绑定到提交点击,并在通过JavaScript添加标题后提交表单数据.在这个过程中,我宁愿不涉及另一层(即JS).

我宁愿不做.有没有办法我可以使用Rails表单助手(或一些控制器助手)为表单提交的请求添加一些自定义标头?

webforms ruby-on-rails http-headers ruby-on-rails-5

15
推荐指数
1
解决办法
2209
查看次数