我有一个表格,它将以下数据发送到服务器:
<!-- This form pulls, using JS event handlers, data from the table record selected -->
<form id="edit_form" action="" method="POST" role="form">
{{ csrf_field() }}
{{ method_field('PATCH') }}
<div class="form-group">
<label>ID do Cartão</label>
<input type="text" class="form-control" name="idcartao_edit" placeholder="ID do Cartão" value="" />
</div>
<div class="form-group">
<label>Nome do aluno</label>
<input type="text" class="form-control"
name="nome_aluno_edit" placeholder="Nome do Aluno" value="" />
</div>
<div class="form-group">
<label>Email</label>
<input type="email" class="form-control" name="email_edit" placeholder="E-mail" value="" />
</div>
<div class="form-group">
<label>Curso</label>
<select id="curso_edit" class="form-control" name="curso_edit">
<option>Seleccionar curso...</option>
@foreach($curso_list as $curso)
<option value="{{$curso->encrypted_id}}">{{$curso->curso}}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>Triénio</label>
<!-- Trigerred by a JS event handler when a curso_edit option is selected -->
<select id="trienio_edit" class="form-control" name="trienio_edit">
<option>Seleccionar triénio...</option>
</select>
</div>
<!-- Triggered when user opens a bootstrap modal. Pulls the value from the table record selected -->
<input type="hidden" id="idcartao_original" name="idcartao_original" value="" />
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Editar aluno</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Fechar</button>
</div>
</form>
在服务器端,用户输入的数据将按如下方式处理:
public function update(Request $request, Aluno $aluno)
{
$id_aluno = $aluno->where('id_cartao', '=', $request->input('idcartao_original'))->first()->id;
$aluno = $aluno->find($id_aluno);
$aluno->id_cartao = $request->input('idcartao_edit');
$aluno->nome = $request->input('nome_aluno_edit');
$aluno->email = $request->input('email_edit');
$aluno->trienio_id = decrypt($request->input('trienio_edit'));
$aluno->save();
return redirect()->route('alunos');
}
此表单的问题是用户可以将id更改为其他用户,并且查询将加载完全非预期的不同用户。比如将值从1更改为2,例如,在此输入字段上:
<input type="hidden" id="idcartao_original" name="idcartao_original" value="" />
所以不要加载这样的模型:
ID: 1
ID Cartão: 1011000
Nome: Joseph Wilson
E-mail: joseph.67@gmail.com
它会加载这样的模型:
ID: 2
ID Cartão: 1011001
Nome: John Black
E-mail: johnblackwilliams@gmail.com
并继续改变a的数据,就像我说的那样,是一种完全无意的不同模型。
我已经尝试使用ajax调用向服务器发送加密的ID,但考虑到输入最终会像这样:
curso_edit选项(加密值是&#34; TAI&#34;选项的加密ID,例如)
<option value="eyJpdiI6ImJqZGJKOGVBOFMyQ0huUXdKVHhFMXc9PSIsInZhbHVlIjoidWpROWRrSUFYREszbTF2Q24zTkVoZz09IiwibWFjIjoiM2QxYWViNzU0NWIyN2M2ZGQzMmMwYWJjYWUxZTAyYzBkOGNlNWQ0MDAzMjIyNzA1YWExNzg5ODA2MmNhYjBiMCJ9">TAI</option>
<option value="eyJpdiI6IjRVMWowT0cwYWxVeWpOXC9YaW0yRlJnPT0iLCJ2YWx1ZSI6IkF1VmZoTGdPT3BsTnR3MWV0bXhGdkE9PSIsIm1hYyI6ImY2ZDRiOGIyZDFmMjdmNjhkYzA4ZDMzNGVmNzY2NWZkYzhiMzA1ODljMmM1Njk3ODA1ZGFkZjQ4MWI5ZGM4MzcifQ==">TAL</option>
依旧......
trienio_edit选项
<option value="eyJpdiI6ImpmTjBHSk8zTzQ0NmFLR0t1SkxhVXc9PSIsInZhbHVlIjoiOTFYOEluYXFWQk4xMVYxYk1JUHZ0Zz09IiwibWFjIjoiMWZhZDU0NmE2MWQwODliYzg3ZDEzM2Q5NTM3NWJiYTUxMzM5ZTQyMjMwMDBjZDI2OGE4ODEyZjAzNjk3MTVlYyJ9">2015-2018</option>
<option value="eyJpdiI6IjhvUTNGbnNZbG1Ja0d0NktFZFRNaGc9PSIsInZhbHVlIjoicGdKeWtZa1VEeHpDTzQ5QVFhRHcrdz09IiwibWFjIjoiM2EwM2IzZDY3Y2VmZWI4N2QzNTUyZGVlMTUxNjVkZjFiOWUzNGViYjdiNTFiMGZmMDEwMjBhY2JlYTg3ZDg3MiJ9">2014-2017</option>
依旧......
即使用户无法访问处于原始状态的ID,他仍然可以使用chrome或其他浏览器检查元素,并拉出与他们想要恶意更改的curso / trienio对应的加密ID(选项中出现的那些)
所以,即使我向服务器发送ajax调用,以便拉出对应于正在改变的项目的加密id,如下所示:
query by corresponding encrypted curso_edit id/value, encrypted trienio_edit id/value, unique email
用户可以检查javascript代码,将加密的curso_edit,trienio_edit值和电子邮件替换为上述选项中的另一个。
我该如何解决这个问题?
p.s - 对我来说不要太苛刻。这个问题有点难以解释,如果你需要更多详细信息,我已尽力解释,
顺便说一下:我已经通过id,id cartao,nome,电子邮件和使用关系,trienio和curso来组织模型。这有点像学校管理系统,凭借这一点,任何知道这个信息的人:课程(curso),年(trienio),卡片ID(id cartao,那些是带有id的学校卡片),名字(nome) )和学生的电子邮件将很容易猜测列值。我需要一些更强大和不可思议的东西。考虑到学校环境,这些信息很容易获得