是否可以通过网络更改参数?

时间:2016-12-11 17:25:16

标签: ruby-on-rails ruby security

我正在编写一个网站,它没有合法的选项来编辑用户。 一旦创建,就不能改变任何东西。

这是我的问题: 是否可以在不使用编辑表单的情况下更改用户数据(例如通过发送补丁请求)(因为我没有创建一个),由第三方(a.k.a。而不是主机)?

正如Rails 5所要求的那样,我使用强大的params(在通过注册表单创建用户时发送用户名和密码)。

@routes

     Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         sessions#new
   signup GET    /signup(.:format)         users#new
          POST   /signup(.:format)         users#create
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

还应该提到没有更新方法,但我正在使用

resources :users

1 个答案:

答案 0 :(得分:2)

对于您的数据库的第三方访问,您可能需要一个API。

简化示例:

您应用的网址为https://myapp.example.com/

配置/ routes.rb中:

namespace :api do
  namespace :v1 do
    resources :users, only: [:update]
  end
end

rake routes:

     Prefix Verb  URI Pattern                 Controller#Action
api_v1_user PATCH /api/v1/users/:id(.:format) api/v1/users#update
            PUT   /api/v1/users/:id(.:format) api/v1/users#update

应用程序/控制器/ API / V1 / base_controller.rb:

class Api::V1::BaseController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  protect_from_forgery with: :null_session
end

应用程序/控制器/ API / V1 / users_controller.rb:

class Api::V1::UsersController < Api::V1::BaseController
  def update
    # check params, maybe look for some security tokens

    user = User.find(params[:id])
    if user
      user.update_attribute(:name, params[:name])
      render plain: "success" and return
    else
      render plain: "failure" and return
    end
  end
end

然后请求这样

curl -X PATCH https://myapp.example.com/api/v1/users/1?name=new_name

会将id = 1 users的{​​{1}}更改为“new_name”。

要获得正确的API设计,您可以查看http://jsonapi.org/