首页 > 解决方案 > Rails 中的安全查询参数

问题描述

我在我的应用程序中发现了一个我不知道如何修复的安全风险。我只是在对 HTML 进行一些检查时发现了这一点,并且正在使用它。

所以我在表单标签上有这段代码

<%= form_tag("/spree/admin/workorders/#{@workorder.id} /?workflow_id=#{workflow.id} &name=workstep_name_{workflow.product_workstep.workstep.name} &workstep_id=#{workflow.product_workstep.workstep.id}", method: "put")do%>

该方法将捕获查询参数。

def update
        @incoming_status = params[params[:name]]
        # grab workflow, this is current data, use this to compare status to in comming status
        @workflow = get_workorder_product_workstep(params[:workflow_id])

        if is_workstep_for_shipping?
          if @workorder.order.shipment_state.downcase == "shipped"
            update_workflow
          else
             flash[:notice] = "Product not yet shipped"
          end
        else   
          update_workflow
        end

        redirect_to admin_workorder_path(@workorder)
      end
 def update_workflow
         # check current status if its pending allow to update
         if @workflow.send("can_#{@incoming_status}?")
          # update status
          @workflow.send(@incoming_status.to_s)
          # updated attribute handled_by
          @workflow.update_attributes(handled_by_id: @curr_user.id)
          @workflow.save
        else
          flash[:notice] = 'Action not allowed'
        end
      end

在浏览器上,在视图中创建的表单将呈现这个。

<form action="/spree/admin/workorders/45/?workflow_id=141&amp;name=workstep_name_w4&amp;workstep_id=61" accept-charset="UTF-8" method="post">
</form>

现在该表单,可以更改那些查询参数值。尝试输入错误的值,我的后端崩溃了。如何解决这个问题?我可以阅读任何想法或文章吗?谢谢你。

更新

在玩网络的时候。我还在网络选项卡上找到了这个request payload

{spree_user: {email: "-----, password: "---"}}
spree_user: {email: "----", password: "----"}

一切都是纯文本。我刚刚将我的电子邮件和密码更改为----

如果一个有技术背景的人可以很容易地发现这一点。

代码来自生产。我认为我们在这里没有使用 JWT。

标签: ruby-on-railssecurity

解决方案


推荐阅读