odysey Posted September 24, 2012 Report Share Posted September 24, 2012 Co je CSRF utok? Jde v něm o to, že útočník provede z cizí stránky nějakou operaci jménem přihlášeného uživatele, aniž by o tom tento uživatel věděl. Nejlepší obranou proti tomuto útoku je generování a kontrolování tokenů. Ruční generování a kontrolování tokenů je nudná práce, na kterou člověk navíc může snadno zapomenout, celá činnost se dá ale automatizovat. Využijeme k tomu funkci ob_start, které předáme funkci hledající formuláře odesílané metodou POST a doplňující k nim skryté pole s tokenem. Druhá část ochrany bude tento token kontrolovat. <?php $stmt = $mysqli->prepare("SELECT * FROM tabulka WHERE nazev = ? OR id = ?"); $stmt->bind_param("si", $_GET["nazev"], $_GET["id"]); $stmt->execute(); ?> Pokud takovou vrstvou nedisponujete nebo se bez ní musíte obejít, je nutné parametry SQL dotazů předávat přímo jako jejich součást. A na tomto místě nastupuje obrana proti SQL Injection. Jeden způsob je ošetřit veškerá vstupní data vhodným způsobem (na což se dá zapomenout), druhý je použít direktivumagic_quotes_gpc a veškeré hodnoty uzavírat do apostrofů. <?php // ošetření vstupních dat mysql_query("SELECT * FROM tabulka WHERE nazev = '" . mysql_real_escape_string($_GET["nazev"]) . "' OR id = " . intval($_GET["id"])); // spolehnutí se na magic_quotes_gpc mysql_query("SELECT * FROM tabulka WHERE nazev = '$_GET[nazev]' OR id = '$_GET[id]'"); ?> Všimněte si, že v druhé variantě je do apostrofů uzavřená i číselná hodnota. MySQL to umožňuje a pokud předaný řetězec nebude na číslo převoditelný, převede se na nulu. Já osobně mám magic_quotes_gpc rád, protože umožňuje vytvářet jednoduchý a přímočarý kód. Pokud se ale na nastavení této direktivy nemůžete spolehnout, nelze použít ani jeden z těchto způsobů. Druhý způsob nelze použít pochopitelně kvůli riziku SQL Injection, první nejde použít proto, že kdyby byla direktiva zapnutá, tak se předaná data budou escapovat dvakrát – jednou kvůli magic_quotes_gpc a jednou funkcí addslashes. V takovém případě je nutné vytvořit si vlastní funkci a použít ji místo addslashes: <?php function gpc_addslashes($str) { return (get_magic_quotes_gpc() ? $str : addslashes($str)); } ?> V některých případech je samozřejmě nutné předaná data ošetřit i v případě zapnuté direktivy magic_quotes_gpc: <?php // nefunguje mysql_query("SELECT * FROM tabulka LIMIT 10 OFFSET '$_GET[offset]'"); // funguje mysql_query("SELECT * FROM tabulka LIMIT 10 OFFSET " . intval($_GET["offset"])); ?> Chris Shiflett uvádí, jak se dá při použití některých vícebajtových znakových sad (např. UTF-8 se to netýká) ochrana slashováním obejít, Ilia Alshanetsky navícdodává, že možnost stejného zneužití se týká i funkce mysql_real_escape_string. V našich zeměpisných šířkách se jedná spíše o teoretickou hrozbu, je to ale hezký příklad toho, že si člověk nemůže být nikdy ničím jistý. zdroj: vrana,wiki Wladass 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.