Contribuição: Segurança PHP - CSRF

  • Autor Autor jtsamper
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
jtsamper

jtsamper

Beta
Programador
Usuário com poucas negociações! Use sempre o saldo do ForoBeta!
No se si conoceis este tipo de fallo de seguridad, pero es muy común y en algo puede perjudicar a los bots.

Lo que hace el script es generar un TOKEN para el formulario cada vez qe se carga una pagina. Y que 100% necesario ejecutarlo con javascript para evitar coger su valor, desde texto plano.

Tengo varias funciones que deben estar siempre activas...
PHP:
if (!empty($_POST)) {
    $token = $_POST[$_SESSION["token"]];
    if ($token != $_SESSION["token_seg"]) {
        echo "Acción no permitida";
        exit;
    }
}
generarToken();

function generarToken() {
    $_SESSION["token"] = uniqid("token_");
    $_SESSION["token_seg"] = md5(uniqid());
}

function ToHex($string) {
    $hex = '';
    for ($i=0; $i < strlen($string); $i++) {
        $hex .= '%' . bin2hex($string[$i]);
    }
    return $hex;
}
Y donde tengas un formulario coges y metes esto...
PHP:
<script>document.write(unescape('<?= strtoupper(stringToHex('<input type="hidden" name="' . $_SESSION["token"] . '" value="' . $_SESSION["token_seg"] . '" />')) ?>'));</script>
Esto sacaria algo asi...
HTML:
<script>document.write(unescape('%3C%69%6E%70%75%74%20%74%79%70%65%3D%22%68%69%64%64%65%6E%22%20%6E%61%6D%65%3D%22%74%6F%6B%65%6E%5F%35%32%64%31%33%32%34%35%62%63%36%32%37%22%20%76%61%6C%75%65%3D%22%32%36%61%64%31%31%64%34%31%64%66%36%62%64%37%65%66%64%38%30%61%63%32%66%61%38%30%63%35%32%31%62%22%20%2F%3E'));</script>
Por tanto alguien que intente ver la pagina en texto plano no le mostrara correctamente, esto..
HTML:
<input type="hidden" value="ba7edc0a320ea1577b8afd48dc2d17de" name="token_52d133287ee46">

Pero el navegador si lo leera correctamente siempre y cuando tenga activado JAVASCRIPT...


Espero que os sirva, de esta forma no os pondran inyectar los formularios y no tendreis que depender de ReCaptch o sistemas similares...

Un saludo
 
Última edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
tambien hay que publicar la web donde la sacaste 🙂
 
Es propio, lo tuve que hacer para un trabajo.
🙂

Tuve que hacer de distintos agujeros que se pueden encontrar en PHP : RFI, Inyection SQL ..
 
Me parece que estas un poco equivocado... se puede seguir inyectando de igual manera al crear el input manualmente usando una función para decodificar el js:
PHP:
function hexToString( $hexString ) {
    return pack("H*" , str_replace('%', '', $hexString));
}
No es para nada seguro ese sistema.
 
Voltar
Topo