我在我的Gemfile之外运行刹车手,所以我没有使用捆绑器.
如果我这样做gem list
,我可以看到我有以下制动员
brakeman (3.3.3, 3.3.2, 3.1.4, 3.1.2)
Run Code Online (Sandbox Code Playgroud)
但如果我这样做brakeman --version
,我明白了
brakeman 3.1.2
Run Code Online (Sandbox Code Playgroud)
所以我没有使用最新版本.如果我这样做gem update brakeman
或
gem update brakeman, '3.3.3,
Run Code Online (Sandbox Code Playgroud)
我明白了
Updating installed gems
Nothing to update
Run Code Online (Sandbox Code Playgroud)
那么如何运行brakeman版本3.3.3?
我刚开始使用Rails,所以我正在使用Brakeman来了解我的新手代码中的潜在漏洞.它在我的show.js.erb
文件中抛出了一个高可信度的"动态渲染路径"警告:
$('#media-fragment').html('<%= escape_javascript(render(params[:partial])) %>');
Run Code Online (Sandbox Code Playgroud)
我实际上预计这是一个问题,所以毫不奇怪.所以我把它改成了以下内容:
# controller:
def show
if legal_partial?
@allowed_partial = params[:partial]
else
raise StandardError, "unexpected partial request: #{params[:partial]}"
end
end
private
def legal_partial?
%w(screenshots video updates).include? params[:partial]
end
# ...
# show.js.erb
$('#media-fragment').html('<%= escape_javascript(render(@allowed_partial)) %>');
Run Code Online (Sandbox Code Playgroud)
虽然我相信代码现在是安全的,但Brakeman仍对此不满意.是否有更惯用的方法来控制基于用户输入的部分渲染?
我已经安装了最新版本的Brakeman gem来帮助我使用Rails应用程序安全性.
我在两台服务器上有几个Rails应用程序,一个用于开发,另一个用于生产.当我在我的应用程序上运行Brakeman报告时,大多数都标记了config/initializers/secret_token.rb,其中存在以下高安全漏洞.
Session secret should not be included in version control near line 7
Run Code Online (Sandbox Code Playgroud)
这是我几个月前运行旧版Brakeman以来我第一次看到这个错误.
根据我迄今为止所研究的内容,当执行rails new appname时,Rails会自动生成秘密令牌.直到现在我才意识到这一点.显然Rails不保护这个文件,如果我决定将我的任何应用程序移动到Github,那么Github访问该应用程序的任何人都可以获得这些信息.这时我没有上传到GitHub,但我想知道如何从config/initializers/secret_token.rb移动secure_token以关闭我的应用程序中的安全漏洞.
我读过的一篇博文建议我将秘密令牌注入ENV变量.将语句从config/initializers/secret_token.rb移动到config/environment.rb会解决问题吗?如果是这样,我将把这个任务添加到我在Rails开发中的任务列表中.
任何帮助,将不胜感激.
Rails应用程序中的模型有一个url列,用户可以在其中输入外部站点的地址.
网址显示在页面上.点击后,除了路由到该网址外,我还需要在应用中执行一些操作.所以我定义了一个控制器动作如下
#objects_controller.rb
def click
@object = Object.find params[:id]
# do some stuff
respond_to do |format|
format.html { redirect_to @object.url }
end
end
Run Code Online (Sandbox Code Playgroud)
并在视图中
<%= 'click me', click_object_path @object %>
Run Code Online (Sandbox Code Playgroud)
Brakeman(正如预期的那样)发出警告
High - Redirect - Possible unprotected redirect
Run Code Online (Sandbox Code Playgroud)
通常,解决方案是添加only_path: true
到重定向并仅允许当前应用程序中的重定向.但在这种情况下,所需的行为是导航到外部站点.
我的问题
我刚刚开始使用brakeman gem来探索我的rails应用程序的安全漏洞.
除了几个跨站点脚本警告之外,我设法让一切都变得整洁.
这些都有以下共同点:
例如
<%= link_to "Click" , :class=> @model.association.attribute, :alt=> @model.association.attribute, :title=> @model.association.attribute, @model.association %>
Run Code Online (Sandbox Code Playgroud)
哪里
@model = @commentable = Model.includes(:association1, association2: {:nested-association1, :nested-association2}).find(params[:id])
Run Code Online (Sandbox Code Playgroud)
这是我需要关注/采取行动吗?我认为Rails 3.2默认会逃脱这些.
我欢迎建议,以帮助我更好地理解这个问题,并确定我应采取的步骤,如果有的话.
在从参数构造订单方法时,如何避免Rails中的制动器警告?
def index
@methods = [:name, :manager, :deadline]
assignments = Assignment.order(sort_column(@methods) + " " + sort_direction).received(current_user).root
end
def sort_column(column_names)
column_names.each do |column|
return column if column == params[:sort]
end
return 'updated_at'
end
def sort_direction
params[:direction] == 'asc' ? 'asc' : 'desc'
end
Run Code Online (Sandbox Code Playgroud)
我正在努力避免将用户生成的代码直接放入查询中,但是制动器仍会警告(中等信度)这是一个SQL注入漏洞.
这是误报吗?如果没有,我该如何纠正漏洞?
如果是这样,有没有一种简单的方法可以避免误报?
我的模型中有一个范围:
scope :assigned_to_user, ->(user) {
task_table = UserTask.table_name
joins("INNER JOIN #{task_table}
ON #{task_table}.user_id = #{user.id}
AND (#{task_table}.type_id = #{table_name}.type_id)
AND (#{task_table}.manager_id = #{table_name}.manager_id)
")
}
Run Code Online (Sandbox Code Playgroud)
因此,在运行刹车员报告后,我得到以下警告:
assigned_to_user | SQL Injection | Possible
Run Code Online (Sandbox Code Playgroud)
所以我尝试了以下方法:
scope :assigned_to_user, ->(user) {
task_table = UserTask.table_name
joins(ActiveRecord::Base::sanitize("INNER JOIN #{task_table}
ON #{task_table}.user_id = #{user.id}
AND (#{task_table}.type_id = #{table_name}.type_id)
AND (#{task_table}.manager_id = #{table_name}.manager_id)
"))
}
Run Code Online (Sandbox Code Playgroud)
这对我不起作用,因为它'
在sql的前面和后面添加了(撇号)。因此,当我将其用作返回一些结果的查询的一部分并且应用此范围时,它将生成错误的sql。
我也试过这个:
scope :assigned_to_user, ->(user) {
task_table = UserTask.table_name
joins("INNER JOIN #{task_table}
ON #{task_table}.user_id = ?
AND (#{task_table}.type_id = #{table_name}.type_id)
AND …
Run Code Online (Sandbox Code Playgroud) 我得到了很多错误,如下所示
Unescaped model attribute near line 20: show_errors(Objective.new(objective_params), :name)
Run Code Online (Sandbox Code Playgroud)
扩展视图
这是我的代码
module ApplicationHelper
# Error Helper for Form
def show_errors(object, field_name)
if object.errors.any? && object.errors.messages[field_name][0].present?
"<label class='text-error'>" + object.errors.messages[field_name][0] + "</label>"
else
return ""
end
end
end
Run Code Online (Sandbox Code Playgroud) 我有一个Rails 4应用程序,当我运行Brakeman时,它(正确地)在我的创建操作中标识了一个不受保护的重定向.但是,添加only_path:true(如在Brakeman Railscast中)并不能解决警告:
def create
refer_url = params[:referrer]
@portfolio = current_user.portfolios.build(portfolio_params)
if @portfolio.save
redirect_to refer_url, notice: "Portfolio was successfully created.", only_path: true
else
render :new
end
end
Run Code Online (Sandbox Code Playgroud)
结果是:
+SECURITY WARNINGS+
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->>
| Confidence | Class | Method | Warning Type | Message >>
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->>
| High | PortfoliosController | create | Redirect | Possible unprotected redirect near line 14: redirect_to(+params[:referrer]+, :notice => "Portfolio was successfully cr>>
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?Brakeman还在识别什么风险?
我有代码。
users_controller.rb
def show
@user = User.find_by id: params[:id]
@microposts = @user.microposts.order_micropost.paginate(page: params[:page], per_page: 5)
end
Run Code Online (Sandbox Code Playgroud)
并查看/user/show.html.erb
<% provide :title, @user.name %>
<div class="row">
<aside class="col-md-4">
<section class="user-info">
<h1>
<%= gravatar_for @user %>
<%= @user.name %>
</h1>
</section>
</aside>
<div class="col-md-8">
<% if @user.microposts.any? %>
<h3><%= t ".count_microposts", count: @user.microposts.count %></h3>
<ol class="microposts">
<%= render @microposts %>
</ol>
<%= will_paginate @microposts %>
<% end %>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
在 micropost/_micropost.html.erb
<li id="micropost-<%= micropost.id %>">
<span class="user">
<%= link_to micropost.user.name, micropost.user %> …
Run Code Online (Sandbox Code Playgroud)