Evitando csrf (sites de falsificação cross-pedido) com php

2 métodos:

Conteúdo

Criar o arquivo de csrf.class.phpProteja suas páginas com csrf.class.php

Um 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

método 1
Criar o arquivo de csrf.class.php

É o principal arquivo contendo todas as funções que usamos para evitar ataques CSRF.

1
Criar csrf.class.php. Comece por criar o arquivo e salvá-lo com o seguinte conteúdo:

lt ;? phpclasse csrf {
Todo o código nesta seção do guia é para ser adicionado no final deste arquivo.
  • 2
    Criar função get_token_id ().
    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-}}


  • 3
    Criar função get_token () função.
    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-}}
  • 4
    Criar função check_valid ().
    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-}}


  • 5
    Form_names Criar function ().
    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-}


  • 6


    Criar a função random ().
    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-}


  • 7
    Classe fecha a chave.
    Isso completa a classe csrf.

    }
    Agora você pode fechar o arquivo csrf.class.php como nós terminar a edição.
  • método 2
    Proteja suas páginas com csrf.class.php

    Estas medidas irão mostrar-lhe como usar a classe para evitar ataques CSRF CSRF.

    1
    Protege uma forma POST.
    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;
    Artigos Relacionados