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')) ?>" /> 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 |
#2 · Zasláno: 4. 9. 2012, 16:02:36
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="" /> 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 |
#4 · Zasláno: 4. 9. 2012, 21:25:30
A
CsrfStorageSession by ti nestačilo?
|
||
Časová prodleva: 12 let
|
0