如果protect_from_forgery在application_controller中提到了该选项,那么我可以登录并执行任何GET请求,但是在第一次POST请求时,Rails会重置会话,这会导致我退出.
我protect_from_forgery暂时关闭了该选项,但想将它与Angular.js一起使用.有办法做到这一点吗?
据我所知,默认情况下Rails没有CSRF对HTTP GET请求的保护,因为它声称它们是幂等的.但是,从这些GET请求返回给用户的敏感信息,我不希望恶意站点检索此信息.
在Rails中保护HTTP GET请求的最佳方法是什么CSRF?
ruby-on-rails csrf protect-from-forgery csrf-protection ruby-on-rails-3.1
我的 rails 应用程序中有一个 react 组件,我试图在其中fetch()将POST发送到托管在本地主机上的 rails 应用程序,这给了我错误:
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
Run Code Online (Sandbox Code Playgroud)
我正在使用设计 gem 来处理user/registrations和logins。
我试图删除 protect_from_forgery with: :exception
这是我的提取代码,
this.state.ids.sub_id});
fetch(POST_PATH, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: body
}).then(res => res.json()).then(console.log);
Run Code Online (Sandbox Code Playgroud)
如何获取 csrf 令牌并通过表单发送它以使其通过?
理想情况下,我只想通过标头发送它,但我不知道如何访问令牌。
我有两个需要通过HTTP相互通信的应用程序.一个是PHP应用程序,另一个是我的主应用程序,Rails应用程序.我需要PHP应用程序通过向其发送数据来与Rails应用程序通信,但是当我这样做时,我收到了无效的真实性令牌错误.有没有办法解决?或者我如何创建自己的令牌以传递POST以便我的Rails应用程序进行身份验证?
我问这个是因为当我开始使用ajax或flash与rails进行通信时,我觉得这让我的生活过于复杂.
我知道防范CSRF很好,但我不能只检查引用者或其他东西吗?
我有使用Rails3构建的网站,现在我想实现用于移动客户端访问的json API.但是,由于protect_from_forgery过滤器,从客户端发送json post请求.因为客户端不会从服务器检索任何数据,所以客户端无法接收auth_token,因此我只想为json请求关闭protect_from_forgery选项(我认为rails3在默认情况下执行此操作,但显然它没有) .
我知道在这里讨论类似的主题,但在这种情况下,他在发送帖子请求之前收到auth_token.
所以我的问题是只关闭json的protect_from_forgery是这样做的好方法吗?如果是,怎么办?如果不是,还有什么选择?
仅供参考,我使用以下ajax请求
$.ajax({
type: 'POST',
url: "http://www.example.com/login.json",
data: { 'email': emailVal, 'password': passwordVal },
success: onSuccess,
error: onError,
dataType: "json"
});
Run Code Online (Sandbox Code Playgroud)
我得到ActionController :: InvalidAuthenticityToken错误.
顺便说一句,遵循curl命令可以工作...
curl -H"Content-Type:application/json"-c cookies.txt -d'{"email":emailVal,"password":passwordVal}'-X POST http ://www.example.com/login.json -i
我正在使用Rails 3.0.2,protect_from_forgery默认情况下它在application_controller.rb中.
我想触发一个InvalidAuthenticityToken.
要做到这一点,我已将此javascript添加到我的页面:
$('input[name=authenticity_token]').val('aaa')
Run Code Online (Sandbox Code Playgroud)
使用Firebug检查DOM我看到authenticity_token隐藏字段已正确更新.
如果我提交表单并从服务器检查日志,我会看到相对参数已正确设置为'aaa'.我希望得到一段InvalidAuthenticityToken时间处理请求,因为它是正确的!
这怎么可能?
我已经在StackOverflow上阅读了关于InvalidAuthenticityToken和protect_from_forgery的多个问题和答案,但没有更明智.
我有一个网站每天都会收到数百个这样的错误.它们似乎主要(仅限于?)来自移动设备,但我只通过样本验证过.
我理解为什么有AuthenticityToken和添加的需要
<%= csrf_meta_tags %>
Run Code Online (Sandbox Code Playgroud)
在application.html(我有)以及在应用程序控制器中有protect_from_forgery.我有csrf_meta_tags和:
protect_from_forgery with: :exception
Run Code Online (Sandbox Code Playgroud)
在我的应用程序控制器中,默认情况下.
我意识到我可以通过删除protect_from_forgery来"解决"这个问题,但这会让我容易受到CSRF攻击,所以这不是真正的解决方案,是吗?对于发生的表单帖子,我可以为protect_from_forgery添加一个"except",但这会让我感到非常脆弱,对吧?
编辑:我尝试使用移动设备访问表单,禁用Cookie并遇到422错误.无法让它导致异常.为我的"结果"函数添加一个例外删除了,但这让我觉得它很脆弱?
Edit2:我在同一页面上有几个表单(例如搜索表单).也许这会影响这个问题?
我现在处于一个我无法拥有它的位置,因为它每天导致数百名用户出错,我无法将其删除,因为我担心它会使我的网站容易受到攻击.
那么,我该怎么办?有一个像样的中间地带?
有什么方法可以改变protect_from_forgery并仍然相信我不会被黑客破坏我的数据库吗?
我没有为网站使用任何API,并且所有错误都来自相同类型的表单.我知道这个问题有一个javascript部分但不是真的如何使用该信息来解决问题.
提前致谢!
我得到的异常示例:
An ActionController::InvalidAuthenticityToken occurred in calculations#result:
ActionController::InvalidAuthenticityToken
-------------------------------
Request:
-------------------------------
* URL : http://www.example.com/calculation/result
* HTTP Method: PUT
* IP address : 217.214.148.251
* Parameters : {"utf8"=>"?", "_method"=>"put", "authenticity_token"=>"udnClerrF5UWvg84uaD82TzmPx/vWssv2wN9UPqyn10UwXqbOwa2FBtnZ5Nfo7HPh9xbA2OSrrUNineW50XiYg==", "commit"=>"Calculate", "controller"=>"calculations", "action"=>"result", "id"=>"123"}
* Timestamp : 2016-08-19 12:11:09 UTC
* Server : 2696e83c-1538-434d-ab6d-4e16577698d0
* Rails root : /app
* Process: 6
-------------------------------
Session:
-------------------------------
* session id: "42b36aacc78102605cb3365922a550b1"
* data: {"session_id"=>"42b36aacc78102605cb3365922a550b1", …Run Code Online (Sandbox Code Playgroud) 我正在开发一个从 facebook 获取详细信息的 Rails 应用程序。我已经从 facebook 获取了详细信息。但是当我刷新网页时,我收到了一个名为 CSRF 检测到的错误。我用过一些方法,但都失败了。
facebook Graph API 用于编辑操作。
这些是在员工控制器的内部类中添加的。
skip_before_action :verify_authenticity_token
skip_before_action :verify_authenticity_token, only: [:edit]
protect_from_forgery :only => [:edit]
skip_before_action :authenticate_user, only: [:edit]
skip_before_action :authenticate_user!
当使用 authentication_user 时(第 4 和第 5 种情况)我收到一个参数错误,
Before process_action callback :authenticate_user has not been defined .
在所有其他情况下,使用 facebook 更新页面后刷新页面时的错误是
OmniAuth::Strategies::OAuth2::CallbackError
csrf_detected | CSRF detected
PS:我使用了 'omniauth-facebook' 和 'koala' gem 进行集成。
ruby-on-rails protect-from-forgery facebook-graph-api omniauth-facebook ruby-on-rails-5
我正在测试一个控制器,它具有以 .js.erb 格式呈现视图的动作。对这些操作的测试会引发以下错误:
Minitest::UnexpectedError: ActionController::InvalidCrossOriginRequest: 安全警告:另一个站点上的嵌入标记请求受保护的 JavaScript。如果您知道自己在做什么,请继续并禁用此操作的伪造保护以允许跨源 JavaScript 嵌入。
伪造保护导致此错误,因为当我对这些操作设置异常时,它可以,但我不想禁用它。
这是我的控制器:
class TasksController < ApplicationController
def new
# TODO add blah later
@task = Task.new
render 'tasks/show_form.js.erb'
end
def create
# FIXME there is bug here
@task = Task.new(task_params)
@task.user = current_user
authorize! :create, @task
save_task
end
def edit
@task = Task.find(params[:id])
authorize! :edit, @task
render 'tasks/show_form.js.erb'
end
def update
@task = Task.find(params[:id])
@task.assign_attributes(task_params)
authorize! :update, @task
save_task
end
def destroy
@task = Task.find(params[:id])
authorize! :destroy, @task
@task.destroy
@tasks = …Run Code Online (Sandbox Code Playgroud) 目前我正在使用 apache pdfbox 创建数字和电子签名。最近我开始了解数字和电子签名中的漏洞,如通用签名伪造 (USF)、增量保存攻击 (ISA) 和签名包装 (SWA)。PDFBox 是自动处理这个问题还是我们需要在代码中额外执行来处理这个问题
security electronic-signature digital-signature protect-from-forgery pdfbox
我制作了一个演示应用程序,rails new demo然后生成了一个脚手架用户控制器rails generate scaffold User name:string email:string.脚手架代码中有一个ApplicationController用protect_from_forgery,所以不会UserController从派生ApplicationController.
我运行webrick,添加一个用户,很酷.真实性令牌的工作方式与/ on上的POST一致.
然而,仍然使用Rails 3.0.5我能够做到:
niedakh@twettek-laptop:~$ telnet 10.0.0.4 3000
PUT /users/3 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
user[name]=vvvvv&user[email]=shiaus.pl
Run Code Online (Sandbox Code Playgroud)
并且在不给出令牌的情况下修改用户3:
Started PUT "/users/3" for 10.0.0.4 at 2011-04-02 14:51:24 +0200
Processing by UsersController#update as HTML
Parameters: {"user"=>{"name"=>"vvvvv", "email"=>"shiaus.pl\r"}, "id"=>"3"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
', "updated_at" = '2011-04-02 12:51:24.437267' WHERE "users"."id" = 3s.pl
Redirected to http://10.0.0.4:3000/users/3 …Run Code Online (Sandbox Code Playgroud)