Autor Zpráva
whoami
Profil
Dobrý den,

chtěl bych požádat o kritiku kódu na obranu proti "CSRF".. ať už z hlediska bezpečnosti, či z hlediska provedení.. Kód jsem zrovna dopsal a ještě není okomentovaný, přesto doufám že je přehledný. Naleznete ho na https://github.com/whoamicz/Athima-Csrf.

Základní inicializace s nástinem všech zatím integrovaných pluginů..:

    define('_PATH', dirname(__FILE__));
    define('_LIB', _PATH.'/libraries');

    // Include
    require_once(_LIB.'/Athima/Csrf.php');
    
    // Storage
    $storage[0] = new \Athima\Csrf\Csrf_Storage_Session(); // Session storage with name "csrf".
    $storage[1] = new \Athima\Csrf\Csrf_Storage_Session('session_custom_name'); // With name "session_custom_name".
    
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=csrf;', '', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $storage[2] = new \Athima\Csrf\Csrf_Storage_Database($pdo); // Database storage in table "csrf".
    $storage[3] = new \Athima\Csrf\Csrf_Storage_Database($pdo, 'database_custom_table'); // In table "database_custom_table".
    
    // Token generator
    $tokenGenerator[0] = new \Athima\Csrf\Csrf_TokenGenerator_RandomHash(); // Random hash token generator with random salt.
    $tokenGenerator[1] = new \Athima\Csrf\Csrf_TokenGenerator_RandomHash('token_custom_salt'); // With "token_custom_salt" as salt.
    
    // Run
    $csrf = new \Athima\Csrf($storage[0], $tokenGenerator[1]);

Použití je pak jednoduché..:

    if ( isset($_GET['token']) ) {
        echo '<pre>';print_r($csrf->checkToken($_GET['token']));echo '</pre>';
    } else {
        echo '<pre>';print_r($csrf->generateToken(0, array('foo' => 'bar')));echo '</pre>';
    }

Do formuláři si například vložíme..:
<input type="hidden" name="csrf" value="<?= $csrf->generateToken(0, array('action' => 'change_password')) ?>" />
A kontrolní script bude obsahovat tuto část
if ( isset($_POST['csrf']) ) {
$csrfData = $csrf->checkToken($_POST['csrf']);
if ( is_array($csrfData) && (isset($csrfData['action']) && ($csrfData['action']='change_password')) ) {
// kontrola vpořádku
}
}

Není problém si udělat noví plugin "storage" který bude tokeny vázat na konkrétního uživatele takže nebude možné podstrčit mu cizí klíč (Plánuji přidat do examples. Z důvodu, že toto řešení "nelze" udělat univerzálně, není v základních pluginech.).
Ugo
Profil
1. nevím k čemu to vlastně je CSFR problém mě napadá jenom v souvislosti s formulářema a tak bych to předně implementoval do nich
2. neřešil jsem kód, na to nemam, ale máš špatně rozdělení, co to je za čunárnu míchat podtržítka s namespace? \Athima\Csrf\Csrf_Storage_Session -> \Athima\Csrf\Storage\Session
whoami
Profil
Ugo:
http://cs.wikipedia.org/wiki/Cross-site_request_forgery dalo by se říct že do formulářů.. aby ti někdo do náhodné stránky nedal
<img src="https://foo.bar/progress/change-my-password/?new_pass=123" alt="" />
pokud by stránka nebyla ošetřena na csrf změnilo by ti to na "https://foo.bar/" heslo pokud bys byl přihlášenej..

A co se týče podtržítek..: "Csrf_Storage_Session" je název class.. namespace je "\Athima\Csrf\" v tomto případě "new \Athima\Csrf\Csrf_Storage_Session()" Nepřijde mi to špatně.. ale pokud ano můžeš mě odkázat na vysvětlení..?
Keeehi
Profil
A CsrfStorageSession by ti nestačilo?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: