如何防止用户恶意改变查询(laravel)

时间:2017-06-29 20:14:37

标签: javascript php ajax laravel encryption

我有一个表格,它将以下数据发送到服务器:

<!-- 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) )和学生的电子邮件将很容易猜测列值。我需要一些更强大和不可思议的东西。考虑到学校环境,这些信息很容易获得

0 个答案:

没有答案