Jump to content
Geekforum.cz

Automatická obrana proti CSRF


odysey
 Share

Recommended Posts

cSWjV.png

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...