Ir para conteúdo
Cesar Melo

[Resolvido] Segurança para requisições PHP

Recommended Posts

Olá, estou com mais uma dúvida sobre segurança. Estou iniciando um projeto de desenvolvimento e ando preocupado com a segurança das minhas requisições.

Exemplo: Tenho uma tela para editar um pedido já criado. Obviamente, esse pedido tem um ID como chave primaria no bando de dados. O que eu faço atualmente:

Na tela de edição de pedido, tenho um <input type="hidden" name="pedidoID" value="13"> por exemplo.

 

Aí quando mando o "submit" ele vai pra outra tela, e com base nesse pedido "13" o sistema fazer as alterações necessárias no banco de dados e etc. Em outras telas, faço algo parecido mas através de Ajax. Legal, funciona, mas ao usar esses inputs dessa forma é uma brecha de segurança certo? Pois alguém mal intencionado pode facilmente localizar e alterar o numero do pedido, causando uma alteração errada no banco de dados.

 

Fiz uma breve pesquisa sobre segurança em PHP, e pensei em duas coisas:

Fazer uma HASH de mão dupla para o valor do ID, que acredito que dificultaria um pouco a possibilidade de alguém alterar.

Ou utilizar $_SESSION["pedidoID"] que penso ser mais seguro para ocultar o valor do ID de um pedido. Porem, utilizando $_SESSION["pedidoID"] ficaria dificil, ou impossível de fazer algumas requisições via Ajax.

Foi o que eu consegui pensar.

 

Alguém com experiência em PHP pode me dar uma orientação sobre como trabalhar melhor com segurança nesse caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente pedidos tem uma FK de identificação do usuário.

Este filtro tem que ser feito no back-end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Cesar Melo, beleza!
 

Segue uma dica que pode ser útil:
 

Os dados que você enviar para o seu formulário, que você quer se certificar que o usuário não alterou antes de submeter, salve eles em uma sessão: 

$_SESSION['esperado'] = [
    'pedidoId' => 5, 
    'preco' => '1000', 
    'desconto' => '10'
];

 

E então quando receber a submissão, verifique se nada de importante foi alterado:

$dadosRecebidos = [
    'pedidoId'   => $_POST['pedidoId'],
    'preco'      => $_POST['preco'],
    'desconto'   => $_POST['desconto']
];

$diferenca = array_diff($_SESSION['esperado'], $dadosRecebidos);

 if ($diferenca) {
    throw new Exception("As informações enviadas não são consistentes!");
 }

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@EdCesar obrigado pela dica cara.

Quando eu for mexer com essa parte de segurança, vou começar dessa forma, utilizando sessions para dados importantes.

Depois vou pesquisando sobre como ter mais segurança por requisições via ajax, pois há telas em que eu listo uma série de pedidos, ou produtos... então acho q não ficaria muito viável utilizar sessions nessas telas.. mas enfim... Uma coisa de cada vez..

Muito obrigado meu caro!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segurança é "relativa" de acordo com a sua aplicação.

 

Aplicação de HASH "duas vias" é tipo "esconder doce de criança" ou seja, não adianta muita coisa porque quaqlquer um que queira burlar o seu sistema vai identificar facilmente o hash utilizado - que geralmente é um base64 - e então vai conseguir a info que você tentou encobrir...

 

Em atualização de registros eu geralmente aplico a seguinte condição

 

Atualizo informações do ID x se o usuario X é igual ao usuario do ID x

Ou seja, somente atualizo o registro se o usuario for o mesmo que registrou.

 

Claro que isso não se aplica a tudo porque há momentos que você não tem um usuario especifico e neste sentido, para preservar o registro da minha base eu opto por sempre ter um campo que sempre chamo de chaveEspecial e num momento de atualização de dados eu verifico sempre se o ID requisitado a ser atualizado possui a mesma chaveEspecial antes de sua atualização

 

Exemplo

 

Registro 01

ID - 567

chaveEspecial - awhxoeirjdakoao@312dk#$5dksotw346

 

Registro 02
ID - 789

chaveEspecial - siufoerfoifemorr09ik0946k085k9654m039d8m

 

Usuario mal-intencionado acessa registro 01 para edita-lo mas ao enviar dados ao servidor ele manda para o registro 02
Neste momento eu verifico a chaveEspecial. Essa chaveEspecial deixo salvo numa session e condiciono a execução sob a verificação da chaveEspecial no registro.

 

Em resumo, se a chaveEspecial não coincidir com a que existe no registro eu retorno FALSE o script.

Desta forma a chaveEspecial nao fica exposta em nenhum campo de formulario e dificultaria o usuario mal-intencionado a entender qual é o fluxo e que informações você utiliza para validar o update.

 

Tudo depende também de como as informações são expostas porque já vi fulanos fazerem o seguinte:

Ao imprimir os registros na tela eles expoem o ID (Por exemplo - lista de relação de pedidos) e no script aplicam um hash sobre esse id e esse id impresso na tela é a chave primaria do registro, ou seja, nada adianta porque o usuario nem precisou se esforçar para saber qual é a identificação do registro no banco já que ele está ali impresso na tela.

 

Boa sorte

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por jaquelss
      Estava fazendo download de coisas que uso no trabalho, mas parece que esqueci de algo. Sempre dá esse erro, mas tecnicamente parece que tá tudo ok?
      Eu esqueci algum programa ou algo do código em si?
      Agradeço desde já.
    • Por emersonandree
      <script type="text/javascript"> $(document).ready(function(){ $('#btn_busca_f').click(function () { var data_ini = $('#data_ini').val(); var data_fim = $('#data_fim').val(); var cod_recurso = $('#cod_recurso').val(); var cod_funcionario = $('#cod_funcionario').val(); var num_op = $('#num_op').val(); $.ajax({ type: 'post', async: false, url: '/intranet/ExportaFimApontamento', data:{ '_token': '{{csrf_token()}}', 'data_ini': data_ini, 'data_fim': data_fim, 'cod_recurso': cod_recurso, 'cod_funcionario': cod_funcionario, 'num_op': num_op }, erro: function () { alert('erro'); }, success: function (data) { return (data); alert('Excel Gerado com Sucesso!'); } }); }); }); </script> este script executa uma função no controller onde ele gera um arquivo excel.xls, porem se eu executar a função direto no controler ele funciona, se eu executar com o script ele funciona mas nao gera o arquivo.xls alguem sabe como posso fazer para que ele baixe o arquivo la na função?
    • Por VCastilho
      Boa Tarde
      Estou tentando desenvolver um Filtro Inteligente, no qual funcionaria da seguinte forma:

      Filtro 1         Filtro 2          Filtro 3          Filtro 4 
      Opção 1
      Opção 2
      Opção 3


      Ao selecionar a Opção 1 do Filtro 1 liberaria as opções do filtro 2

      Filtro 1         Filtro 2              Filtro 3          Filtro 4 
      Opção 1      Opção 1 - a     
                           Opção 1 -b
                           Opção 1 -c

      Assim escolhendo a opção do filtro 2 liberaria as opções do Filtro 3 e assim por diante
      Ao escolher a Opção 2 do Filtro 1 liberaria outras opções

      No caso preciso aplicar na plataforma da Tray, que é o de menos porém não consigo chegar ao código certo
      Estou tentando utilizar o HTML e o JQuery em conjunto para isso, conseguem me ajudar? Realmente estou perdido na situação

      Atenciosamente Vinicius Castilho
    • Por lucianfpaula
      Olá gostaria de saber se alguém poderia me dar a direção para o seguinte:
      Quero desenvolver um serviço do tipo wix, onde a pessoa pode criar o site dela baseado em um template que irá ter no sistema. muito grato
    • Por Andersonografia
      Gostaria de agradecer o topico do Tonga (topic/436039-resolvido refresh/) pois me esclareceu a criar um método prático para certificar se o form vem do botão ou do F5.
      Vou esclarecer também que só tenho essa necessidade quando o primeiro form do documento é um input, porque na maioria dos meus casos sempre é um search.  
       
      No Value do botão eu coloco o time:
      <button type="submit" name="carga" class="button" value="<?PHP echo $time;?>"> Coloco a condição se estiver setado e se for diferente da sessão:
      if(isset($_POST['carga'])) { $compara = ($_POST['carga']); if($compara != $_SESSION['compara']) { E depois do insert, ainda dentro da condição eu gravo a variável na sessão:
      $_SESSION['compara'] = $compara; Obrigado mais uma vez ao Tonga e ao Forum. Se alguém souber de um método mais prático, por gentileza será muito útil divulgar!!!!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.