27 martie 2012

Form Spoofing in HTML

  Form spoofing este o metoda prin care un script poate primi o cerere falsificata, trimisa printr-un formular strain, din afara aplicatiei noastre, cu elemente diferite fata de cele presupuse initial, dar care au aceeasi denumire.

  De exemplu: presupunand ca intr-un formular avem un select, care la randul lui are cateva optiuni predefinite - daca se afla numele acestui select atunci cineva poate simula acest formular punand in el un input text cu acelasi nume ca si select-ul si cu orice valoare. Rezultatul este inconsistenta datelor.

  Solutie: atasarea la formular a unui input type hidden cu o valoare generata dinamic iar aceasta valoare sa fie, in plus, inclusa si in array-ul global $_SESSION , ca variabila ce tine de sesiunea curenta.

-----------------------  index.php


<?php
session_start();
$_SESSION['secret'] = md5(uniqid(mt_rand(), true));

// formularul corect
echo '    <form action="destinatie.php" method="POST">
    <select name="color">
        <option value="red">red</option>
        <option value="green">green</option>
        <option value="blue">blue</option>
    </select>
<input type="hidden" name="secret" value="'. $_SESSION['secret'] .'"/>
    <input type="submit" />
    </form> <p/><p/>';

// formularul falsificat
echo '<form action="destinatie.php" method="POST">
    <input type="text" name="color" />
    <input type="submit" />
<input type="hidden" name="secret" value="100"/>
      </form>';
?>

-------------------- destinatie.php


<?php
session_start();

if (isset($_POST['secret']) == false || $_POST['secret']!=$_SESSION['secret']) {
echo "form spoofing";
return ;
}

?>

  La destinatie se verifica daca in formular exista un element cu denumirea 'secret'. Acesta trebuie, in plus sa aiba aceeasi valoare cu $_SESSION['secret'], ceea ce inseamna ca sesiunea din care vine formularul este aceeasi cu cea a utilizatorului curent care a ajuns la destinatie. Pentru a evita orice fel de coincidenta, valoarea "secreta" care verifica egalitatea este un md5 al unui identificator unic bazat pe timpul curent in microsecunde, si prefixat cu  un numar random....

Niciun comentariu: