Evitando csrf (sites de falsificação cross-pedido) com php
2 métodos:
Criar o arquivo de csrf.class.phpProteja suas páginas com csrf.class.phpUm ataque falsificação de solicitação entre sites (CSRF para o short) é um tipo de vulnerabilidade de aplicações web em que a vítima inadvertidamente executar um script em seu navegador que lhe permite tirar partido da sessão que tinha começado em qualquer local determinado. ataques CSRF pode ser feita com GET ou POST solicitações. Este artigo mostra como evitar ataques CSRF sobre sua aplicação web.
passos
Vamos usar dois métodos para evitar ataques CSRF sobre as suas ordens GET e POST.
A primeira coisa a fazer é um identificador aleatório para cada pedido, uma cadeia exclusiva que é gerado para cada sessão. Geramos o identificador e incluí-lo em todas as formas como uma entrada escondida. O sistema irá verificar se o formulário for válido, comparando o identificador que é armazenado na variável de sessão do usuário. Ou será que um invasor pode gerar uma ordem, você deve saber o valor do identificador.
O segundo método consiste em utilizar um nome aleatório para cada campo no formulário. O valor do nome de cada campo aleatório é armazenado em uma variável de sessão e o sistema irá gerar um novo valor aleatório depois de terem submetidos a forma. Ou é para executar um ataque, o atacante tem de adivinhar estes nomes aleatórios sobre os formulários.
Por exemplo, uma ordem que antes era assim:
Agora esta aparência:
passos
É o principal arquivo contendo todas as funções que usamos para evitar ataques CSRF.
lt ;? phpclasse csrf {
Esta função obtém o ID da sessão do usuário. Se não tivesse sido produzido antes de um novo identificador aleatório é gerado.
público função get_token_id() {se(isset($ _SESSION)) {retorno $ _SESSION-} mais {$ TOKEN_ID = $ this--gt;acaso(10)-$ _SESSION = $ TOKEN_ID-retorno $ TOKEN_ID-}}
Esta função obtém o valor do identificador. Se não for criado um antes, será agora gerada.
público função get_token() {se(isset($ _SESSION)) {retorno $ _SESSION-} mais {$ simbólico = de hash(`SHA256`, $ this--gt;acaso(500))-$ _SESSION = $ simbólico-retorno $ simbólico-}}
Esta função é usada para verificar se o identificador e o valor do identificador são válidos. Ele faz isso comparando os valores de GET ou POST pedido com os valores armazenados na variável de sessão do usuário.
público função check_valid($ method) {se($ method == `Post` || $ method == `Get`) {$ post = $ _ POST-$ get = $ _GET-se(isset(${$ method}) && (${$ method} == $ this--gt;get_token())) {retorno verdadeiro-} mais {retorno falso-}} mais {retorno falso-}}
Este é o segundo artigo defesa contra CSRF. Esta função gera nomes aleatórios para os campos do formulário.
público função form_names($ names, $ regenerado) {$ valores = ordem()-foreach ($ names ás $ N) {se($ regenerado == verdadeiro) {unset($ _SESSION)-}$ s = isset($ _SESSION) ? $ _SESSION : $ this--gt;acaso(10)-$ _SESSION = $ s-$ valores = $ s-}retorno $ valores-}
Esta função gera uma seqüência aleatória usando o linux arquivo aleatório para uma maior entropia.
privado função acaso($ len) {se (@is_readable(`/ Dev / urandom`)) {$ f=fopen(`/ Dev / urandom`, `R`)-$ urandom=fread($ f, $ len)-fclose($ f)-}$ return=``-para ($ i=0-$ ilt;$ len-++$ i) {se (!isset($ urandom)) {se ($ i%2==0) mt_srand(tempo()%2147 * 1000000 + (duplo)microtime() * 1000000)-$ rand=48+mt_rand()%64-} mais $ rand=48+ord($ urandom)%64-se ($ randgt;57)$ rand+=7-se ($ randgt;90)$ rand+=6-se ($ rand==123) $ rand=52-se ($ rand==124) $ rand=53-$ return.=chr($ rand)-}retorno $ return-}
Isso completa a classe csrf.
}
Estas medidas irão mostrar-lhe como usar a classe para evitar ataques CSRF CSRF.
O código abaixo demonstra como implementar classe CSRF em um formulário.
lt ;? phpsession_start()-incluir `Csrf.class.php`-$ csrf = novo csrf()-// Gera um identificador e valida$ TOKEN_ID = $ csrf-gt;get_token_id()-$ token_value = $ csrf-gt;get_token($ TOKEN_ID)-// Gerar nomes aleatórios para a forma$ form_names = $ csrf-gt;form_names(ordem(`User`, `Senha`), falso)-se(isset($ _ POST], $ _ POST])) {// Verifique se o identificador e seu valor são válidos.se($ csrf-gt;check_valid(`Post`)) {// Obter as variáveis de formulário.$ user = $ _ POST]-$ password = $ _ POST]-// O Formulário função vai aqui}// Gerar um novo valor aleatório para o formulário.$ form_names = $ csrf-gt;form_names(ordem(`User`, `Senha`), verdadeiro)-}?gt;