gpt4 book ai didi

javascript - 如何保护我对 Devise/CanCan/JavaScript 的使用?

转载 作者:行者123 更新时间:2023-11-30 06:35:05 25 4
gpt4 key购买 nike

我有一个受 Devise/CanCan 使用 :authenticate_user!load_and_authorize_resource 保护的 Controller 。我必须添加 :except => [:sort] 才能让我的 sort 操作在 javascript 中工作,因为 javascript 连接到 sort 操作不包括 current_user 或其 Angular 色。

我已经通过使用 gon 解决了这个问题传递 current_user 的 Role(如果没有 current_user,则传递 'anonymous')。我不确定这在 JavaScript 端是否安全(也许可以在浏览器的控制台中设置/覆盖变量),而且我确定我的 sort 操作不安全,因为我已将其打开以供直接 POST 访问 - 我通过发送操作正确的参数使用 RESTed 对此进行了测试,这导致了数据的重新排序。

那么:我如何启用从 JavaScript 安全访问受 Devise/CanCan 保护的 Rails Controller ?

这是我的 Rails 应用程序的详细信息...

这是( chop 的) Controller ,显示我如何从 Devise/CanCan 中免除 sort 操作并将 gon.current_user_role 变量设置为 Role current_user,如果可用:

class ThingsController < ApplicationController
before_filter :authenticate_user!, :except => [:sort]
load_and_authorize_resource :except => [:sort]

def show
@thing = Thing.find(params[:id])

if current_user
gon.current_user_role = current_user.role
else
gon.current_user_role = "anonymous"
end

respond_to do |format|
format.html
end
end

def sort
params[:thing].each_with_index do |id, index|
Thing.update_all({position: index+1}, {id: id})
end
render nothing: true
end

end

在我看来,我有一个未排序的项目列表,只能由具有“admin” Angular 色的用户排序:

<ul class="things" data-update-url="<%= sort_things_url %>">
<% @things.each do |t| %>
<%= content_tag_for(:li, t) do %>
<%= image_tag t.image %>
<% end %>
<% end %>
</ul>

这是 application.js 文件中的 javascript,如果 gon.current_user_role 变量是“admin”,我只在其中使列表可排序:

$(function() {
if (gon.current_user_role == "admin")
{
$( ".things" ).sortable({
update: function() {
return $.post($(this).data('update-url'), $(this).sortable('serialize'));
}
});
$( ".things" ).disableSelection();
}
});

最后,我的 routes.rb 文件打开了对 POST 调用的 sort 操作:

  resources :things do
collection { post :sort }
end

最佳答案

我误认为 JavaScript 与排序操作的连接不包括 current_user 或其 Angular 色。我弄错的原因是因为我正在使用 Pow ,所以我一直在访问我的 Rails 应用程序 http://railsapp.dev ...但是我的 JavaScript 请求被标记为来自 127.0.0.1 ...所以它们被视为 XSS 请求。

当我使用 rails s 启动标准 Rails 服务器时,或者当我在暂存服务器上进行这些尝试时,JavaScript 知道 current_user

我的 Controller 最终是这样的:

class ThingsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource

def show
@thing = Thing.find(params[:id])

if current_user
gon.current_user_role = current_user.role
else
gon.current_user_role = "anonymous"
end

respond_to do |format|
format.html
end
end

def sort
params[:thing].each_with_index do |id, index|
Thing.update_all({position: index+1}, {id: id})
end
render nothing: true
end

end

我的 View 和 JavaScript 保持不变。

此设置不允许对 sort 操作进行任意 POST 调用,并且还可以防止没有“admin” Angular 色的人重新排列项目。如果有人确实弄清楚了如何操作 gon.current_user_role JavaScript 变量,他们将能够明显地重新排列页面上的项目,但这种重新排列不会存储在数据库,因为 sort 操作将不允许请求(并且它们的更改将在下一个页面加载时恢复)。

此设置无法解决我的 Pow 问题,但我可以接受。

关于javascript - 如何保护我对 Devise/CanCan/JavaScript 的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com