如何安全地将数据发送到控制器?

时间:2018-04-05 20:46:42

标签: php laravel

我有篮球比赛详情页面" single.blade.php"以及要购买的页面" payment.blade.php"。在匹配详细信息页面中,用户可以通过选择每种类型所需的票数来选择。例如,用户可以为中央工作台选择2张门票,为左侧工作台选择2张门票,然后点击"下一步"。

当用户点击"下一步"时,用户选择的每种故障单类型的数量都存储在一个数组中,以便可以在payment.blade.php页面中显示该信息。

以下代码可以正常使用。

但是如何传递价格?

在比赛详细信息页面中,我得到了每种机票类型的价格" {{$ticket->showPrice()}}"如下所示。

匹配详细信息页面列出了各种类型的门票,每个门票都有一个选择菜单,因此用户可以选择每个门票的门票数量:

<ul>
    @foreach($tickets as $ticket)
        <li>
            <span>{{$ticket->title}}</span> 
            <form method="post" action="{{route('matchs.payment', ['id' => $match->id, 'slug' => $match->slug])}}">

                <select name=type[{{ $ticket->title }}]>
                    <option selected>0</option>
                    ...
                </select>
            </form>
            <span>X {{$ticket->showPrice()}}</span>
        </li>
    @endforeach
    <li>
        <span>TOTAL</span>
        <span>0.00€</span>
    </li>
    <input type="submit" value="Go To Payment Page"/>
    </form>
</ul>

如果我给控制器中的<span name="typePrice">X {{$ticket->showPrice()}}</span>指定了一个名称&#34; dd($ request-&gt; all());&#34;没有显示价格,它只显示类型和数量,它没有显示价格:

array:2 [▼
  "_token" => ""
  "type" => array:2 [▼
    "center bench" => "2"
    "lateral bench" => "1"
      ]
]

控制器:

class PaymentController extends Controller
{
    public function storeQuantity(Request $request){

        dd($request->all());
        $selectedRtypes = $request->rtype;

        return view('events.registration')->with('selectedRtypes', $selectedRtypes);
    }
}

您知道为什么价格没有传递给控制器​​吗?但是你也知道这种方法在安全性方面是否合适?因为在列出故障单类型的匹配详细信息页面以及每个故障单类型的价格中,用户可以在源代码中更改价格吗?然后控制器将收到不正确的价格并将不正确的价格传递给付款页面。

这对数量类型和票证类型名称也有效,用户可以在源代码中更改不存在的名称的票证类型名称,也可以添加例如数量&#34; 1000&#34 ;这是不可能的。

您是否知道如何处理此上下文,如何仅允许向控制器发送正确的数据?

1 个答案:

答案 0 :(得分:3)

如果我正在构建此应用程序,我将不允许用户编辑价格。我会存储(无论是在会话还是数据库中)座位类型和每个座位的数量。我不会通过请求传递付款信息。我会根据座位成本乘以数量来计算价格,并将其存储在会话/数据库中。我只会给用户一个只读价格的视图。

当您进入付款页面时,您需要直接从会话或数据库中提取信息。

这是唯一安全的方式,就像您通过有关价格的请求传递信息一样,它可以被滥用。