Viz kluci, motas to.
1. htmlspecialchars - je funkce, ktera ve stringu prevede znaky, ktere by html zobrazil jako html kod, jedna se o tagove znacky vetsi a mensi, uvozovky jednoduche, dvojite, ampersand. Popis najdes v manualu, php.net/htmlspecialchars . Zalezi, jake pouzijes parametry. A pouziva se to k tomu, aby ti to nerozhodilo html kod.
Example #1 htmlspecialchars() example
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
?>
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo '<pre>'.$new.'</pre>';
echo '<span title="'.$new.'">Toto je span a v title je text escapovany pomoci htmlspecialchars</span>';
echo '<input value="'.$new.'">';
?>
Ano, lze to pouzit jako bezpecnostni opatreni proti hackovani, kdyz se nemuzes spolehnout na to, ze je vystup $new v poradku. Napriklad, kdyz ti tam neco vklada uzivatel.
2. Pokud ziskavas text od uzivatele, tak jej ziskavas jako napr $_GET['album'] . Ale, hacke vyrobi program, ktery ti odesle v vlastni data, napriklad: "
$album = "1 OR 1=1";
$query = "SELECT * FROM albumy WHERE album=" . $album;
SELECT * FROM albumy WHERE album=
SELECT * FROM albumy WHERE album=1 OR 1=1
-- a tento sql prikaz ti zobrazi celou tabulku albumy, protoze 1=1 je true
-- za vsech okolnosti
SELECT * FROM albumy WHERE album=1 OR (TRUNCATE albumy)
-- a tento prikaz ti smaze albumy
SELECT * FROM albumy WHERE album=1 OR (TRUNCATE users)
-- a tento prikaz ti smaze vsechny uzivatele, pokud tam mas tabulku users
Tak, proti tomu se lze branit tak, ze data od uzivatele vyfiltrujes. A take nez je predas do sql prikazu. V tomto pripade by stacilo
$album = $_GET['album'];
$album = (int) $album; // prevede na integer
$album = $album * 1; // nebo to prevedes na cislo, integer nebo float
A kdyz to posilas do sql, tak bys mel hodnotu escapovat i pro sql. Pokud do prikazu vkladas cislo, tak odstranit z hodnoty znaky, ktere cisla nebo desetinna carka, nejsou. Pokud ji pouzivas jako string, tak nahradit vsechny uvozovky, A pokud ji pouzivas jako key, tak nahradit vsechny zpetne uvozovky. K tomu jsou php/sql prikazy podle typu databaze.
SELECT * FROM albumy WHERE album=1 -- cislo
SELECT * FROM albumy WHERE album_name='fotky' -- string
SELECT * FROM albumy WHERE album_name='fo'tky' -- string, ktery obsahuje apostrof a tim narusuje sql prikaz, chyba!
SELECT * FROM albumy WHERE album_name='fotky' -- sql nazev album_name
SELECT * FROM albumy WHERE `album_name`='fotky' -- sql nazev album_name se zpetnymi apostrofy, spravneji zapsany
SELECT * FROM albumy WHERE `albu`m_name`='fotky' -- sql nazev album_name se zpetnym apostrofem uprostred, chyba!
$album_name = "albu`m_name" -- kdyz ti to uzivatel nebo hacker posle takhle, tak ti sql prikaz skonci chybou
"SELECT * FROM albumy WHERE `". $album_name ."`='fotky'
SELECT * FROM albumy WHERE `albu`m_name`='fotky'
3. url php/html
$album = $_GET['album']; // 1
$url = '../galerie.php?album='.$album;
header("Location: ".$url);
// ted si nejsem jisty, zda to udela spravne, ale pravdepodobne bude ignorovat ../
header("Location: http://localhost/meet2eat/".$url);
// tohle presmeruje na adresu http://localhost/galerie.php?…, coz muze byt chyba, hacker se dostal mimo povolenou strukturu, takze bys mu nemel dovolit zadavat adresu s ../ na zacatku nebo ../../../ uprostred adresy
echo '<a href="'.$url.'">odkaz</a>';
// <a href="../galerie.php?album=1">odkaz</a> // $album = 1
// <a href="../galerie.php?album="</a><a href="seznam.cz">odkaz</a> // $album = "</a><a href="seznam.cz
// uzivateli se zobrazi <a></a><a href="seznam.cz">odkaz</a>
// takze, kliknutim na odkaz se dostane na jinou stranku
echo '<a href="'.htmlspecialcharcs($url).'">odkaz</a>';
// <a href="../galerie.php?album="</a><a href="seznam.cz">odkaz</a> // $album = "</a><a href="seznam.cz
// to je lepsi, nenarusi se html kod, adresa je spravne, ikdyz nic nezobrazi
$album = $_GET['album'];
$album = urlencode($album); // hodnova pro url pouziva pro escapovani funkci
urlencode, ktera odstranuje z hodnoty znaky, ktere tam nemaji byt
$url = '../galerie.php?album='.$album;
pr:
$album = "0&userid=2";
$url = '../galerie.php?album='.$album;
../galerie.php?album=0&userid=2 // tak to treba je take chybna adresa pro odkaz, kdyz nepouzijes urlencode