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 gustavozavanin
      Olá Galera, 
      O site de um cliente foi atacado por vírus no mês passado. Contratei os serviços da empresa Sucuri.net e eles me entregam os arquivos íntegros e o site funcionando novamente. Para a minha surpresa, o google não quer indexar os meus anúncios, mesmo após a avaliação manual, eles acusam que ainda existem links com redirecionamentos dentro do site.

      (Esses são os links que o Google acusa após a avaliação manual)
       
      http://www.hipermixbrasil.com.br/argamassa.php http://www.hipermixbrasil.com.br/contato-detalhe.php?id=MQ== http://www.hipermixbrasil.com.br/ http://www.hipermixbrasil.com.br/simulador.php http://www.hipermixbrasil.com.br/servicos-detalhe.php?id=Mw==
      Eu já tentei criar redirects 301 para essas páginas.
      Eu não consigo solucionar esse problema. O site está 100% limpo segundo 3 scanners diferentes, incluindo o monitor de problemas do Google.

      Por favor se alguém puder me ajudar, já não sei mais o que fazer
    • Por Kelven
      Olá pessoal tudo bem?
       
      Então eu quero colocar um formulário de newsletter em um servidor q não tem suporte para php, o negócio é q depois que a pessoa clica em se cadastrar eu quero que ela seja redirecionada para outro site, então gostaria de saber como posso estar fazendo isso usando apenas javascript, jquery ou ajax com o API do Mailchimp? Porque já procurei muito e não achei, só achei em php.
    • Por Rafael Ferreira_163968
      Boa noite amigos, armazeno em um mysql senhas geradas pelo seguinte codigo:
       
      $name = "name"; $email = "email"; $password = "pass"; $string = mcrypt_create_iv (24, MCRYPT_DEV_URANDOM); $salt = strtoupper(bin2hex ($string)); $hash = hash_pbkdf2 ("sha1", $password, $string, 1000, 24, true); $hash = strtoupper(bin2hex ($hash)); //finalmente execute a seguinte consulta: $qrCreate = "INSERT INTO tc_users (name, email, hashedpassword, salt) VALUES ('$name', '$email', '$hash', '$salt')"; $stCreate = mysql_query($qrCreate) or die ('Erro ao cadastrar em '.$tabela.' '.mysql_error()); esse codigo insere um hash e salt unico nos campos, por mais que insira a mesma senha em outro usuario o hash e salt serao diferentes.
       ai vem a duvida, como eu faço para comparar a senha texto digitada pelo usuario com os dados inseridos no BD, por exemplo,
      se eu fizer a seguinte comparacao:
      $readTeste = read('tc_users',"WHERE id = '2'"); foreach ($readTeste as $teste); $pass = $teste['hashedpassword']; if (password_verify('pass', $pass)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } so me retorna invalido. function read esta funcionando, se eu printar o resultado da hashedpassword ele retorna os dados do banco ok. minha duvida e como comparar a senha texto com o banco, se é com o hash ou com o salt ou com os dois junto e como. desde ja obrigado
    • Por adrianoavilao
      Uso a menos de 3 meses o Cobia11 Gravity aqui na empresa.
       
      Sem explicação, quando abrir o aplicativo ele tava com os Menus ( >> , Play , X , | | , + , Engranagem , etc) , travados, não consigo executar as tarefas os bks imediatamente. A tela abaixo “Branca”, de vizualizão Literalmente Sem nada.
       E o backup não  faz. 
       
      O que pode ser? 
      Sera que preciso reinstalar? 
       
×

Informação importante

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