Php 使用路由参数和隐藏输入值信任用户

Php 使用路由参数和隐藏输入值信任用户,php,html,laravel,laravel-routing,laravel-5.8,Php,Html,Laravel,Laravel Routing,Laravel 5.8,我正在与laravel一起创建一个学校管理系统软件,这个项目恰好是我的第一个大项目,用于商业用途。而且没有人监督这项工作(所以你看,我这里真的需要建议)。所以我遇到的问题是,什么时候信任用户输入,什么时候在另一个表中使用模型之前检查模型是否存在。例如,在将学生id插入“出席”表之前,检查“用户”表中是否存在“学生id”。这个问题也适用于我希望在其他表中持久化模型的每一次。作为说明,我拿出了一部分让学生参加的代码 HTML 因此,尽管我对$section\u id和$sement\u id使用了隐

我正在与laravel一起创建一个学校管理系统软件,这个项目恰好是我的第一个大项目,用于商业用途。而且没有人监督这项工作(所以你看,我这里真的需要建议)。所以我遇到的问题是,什么时候信任用户输入,什么时候在另一个表中使用模型之前检查模型是否存在。例如,在将学生id插入“出席”表之前,检查“用户”表中是否存在“学生id”。这个问题也适用于我希望在其他表中持久化模型的每一次。作为说明,我拿出了一部分让学生参加的代码

HTML

因此,尽管我对$section\u id和$sement\u id使用了隐藏输入,但我知道用户(管理员)可以使用浏览器控制台更改这些值,然后发送表单。想象一下管理员有意或无意地(显示for的路径如下
“daily/student/section/{section\u id}”)
将$section\u id或$sembert\u id更改为与sections表和semests表中的任何模型都不对应的值。Boom!!!他或她(管理员)参加了一个甚至不存在的部分或学期,这不好,因为它破坏了数据库的完整性。所以问题是,我应该信任管理员,还是在插入到“Attentations”表之前,我应该检查$section\u id和$Serment\u id是否存在于相应的表中(这样做也会增加脚本结束的时间)。
同时查看php代码,学生id值也可以从html中篡改,您可以看到代码循环通过标记为“出席”和标记为“缺席”的学生数组,我是否应该在参加会议之前检查“用户”表中是否存在$student_id(这样做也会增加脚本结束的时间)或者我也应该信任管理员吗?

规则总是说永远不要信任用户,特别是在谈到数据完整性时。我建议尝试一下laravel的验证方法:

但是,如果性能是您首先关心的问题,我会在第一次请求Attentience页面时将UserID和SectionID缓存在redis哈希中一段时间,然后检查例如student_id是否在缓存的user_id中 如果您想查看Laravel的缓存:

尽管此问题是征求意见(stackoverflow并非针对此问题),我说,永远不要相信用户。它可能是管理员,也可能是攻击者,故意在代码中制造漏洞,或者可能是你这边的一个bug,如果你没有正确检查存在性以及对每个对象的访问权,它会扰乱数据库。
<form method="POST" action="{{route('daily.attendance')}}">
    @csrf
    <input type="hidden" name="section_id" value="{{$section_id}}">
    <input type="hidden" name="semester_id" value="{{$semester_id}}">
@foreach ($sections as $section)

 @foreach ($section->users as $student)      
            <input type="checkbox" name = "present[]" value = "{{$student->id}}" class = "present">
            <input type="hidden" name = "students[]" value = "{{$student->id}}"> 
 @endforeach

 @endforeach
<button type="submit" class="btn btn-primary" >{{ __('take attendance') }}</button>      
</form>
public static function takeStudentDailyAttendance($request){

        $presentStudents = ( isset($request->present) ) ? $request->present : [] ;
        $dataForPresent = collect( $request->except(['present' , 'students']) )->merge(['status' => 1 , 'takenBy_id' => Auth::user()->id])->toArray();
        $dataForAbsent = collect( $request->except(['present' , 'students']) )->merge(['status' => 0 , 'takenBy_id' => Auth::user()->id])->toArray();

        DB::transaction(function () use ($request , $dataForPresent , $dataForAbsent , $presentStudents) {

            foreach($request->students as $student_id){
                if( in_array($student_id , $presentStudents) ){

                    $dataForPresent['student_id'] = $student_id; 
                    StudentDailyAttendance::create($dataForPresent);

                }else{
                    $dataForAbsent['student_id'] = $student_id;
                    StudentDailyAttendance::create($dataForAbsent);
                } 
            }
        });
    }