Autor | Zpráva | ||
---|---|---|---|
DarkMeni Profil |
#1 · Zasláno: 4. 6. 2011, 14:57:27
Ahoj, je možné nějak zkontrolovat $_GET pole a v případě XSS ho opravit?
Na jednoduchou kontrolu používám tento kód: foreach($_GET as $get){if(eregi("(<script)|(<iframe)|(<meta)|(<noscript)",$get)){Shutdown("Possible XSS Attack!");}} Ale někdo mi tu myslim že řekl že "ereg" a jemu podobné se mají od verze 5.3.0 ostranit a s "preg_" to neumim, angličtinu neovládám a ty regulerní výrazy tam jsou trochu jiné (kdyby měl někdo link na reg výrazy pro preg_ v češtině a dal by mi ho tak mu budu vděčný). Jinak tu kontrolu by jsem chtěl provézt něco v tom typu že by to mělo udělat něco jako toto: foreach($_GET as $_GET){$_GET = htmlspecialchars(mysql_real_escape_string($_GET));} ale to mi vrátí prázdný řetězec a to pole mi vlastně úplně vymaže, jak to? ... Jinak, je pravda že od té 5.3.0 PHP verze funkce ereg zmizí? :-( |
||
Ernie Profil |
#2 · Zasláno: 4. 6. 2011, 15:54:54
DarkMeni:
„je možné nějak zkontrolovat $_GET pole a v případě XSS ho opravit“ Ono je těžké jednoznačně identifikovat XSS. Takže je lepší nahradit všechny "systémové znaky" (<, >, & apod.) za entity (jak to popisujete později). Cyklus by ale měl vypadat takto: <?php foreach($_GET as $index=>$get) { // např. z $_GET["index"]="cokoliv" udělá $index="index" a $get="cokoliv" $_GET[$index] = htmlspecialchars(mysql_real_escape_string($get)); } ?> |
||
Tori Profil |
#3 · Zasláno: 4. 6. 2011, 16:18:58
<mírné-OT>
Ad „htmlspecialchars(mysql_real_escape_string($get))“: Jestli se nepletu, tak tu mícháte dvě věci dohromady: mysql_real_escape_string() se používá při ukládání do DB, kdežto htmlspecialchars() při výpise na obrazovku. A myslím, že tahle kombinace obou způsobí, že při výpise z DB budou všechny apostrofy a uvozovku nejen enkódované do entit, ale navíc budou před nimi zpětná lomítka - když už, tak bych ty funkce použila v opačném pořadí: mysql_real_escape_string(htmlspecialchars($string)) </mírné-OT> |
||
DarkMeni Profil |
#4 · Zasláno: 4. 6. 2011, 19:49:25 · Upravil/a: DarkMeni
Mě jde jen o to aby mi ten výstup (kdyby se náhodou nějakej hacker nudil) neudělal nic v databázi a aby tam nebyly ani značky co prohlížeč pochopí jako html kódy.
Neví teda někdo něakou stránku s reg výrazy pro preg_ ? Edit: A kdyby jsem tam místo $_GET napsal $_REQUEST tak mi to zabezpečí i $_POST že? |
||
DarkMeni Profil |
#5 · Zasláno: 4. 6. 2011, 23:02:39
Tak po krátkém testování nebo spíš hraní si jsem přišel na to že to "mysql_real_escape string($get)" všechno zkazí a nic nevrátí a nijak nemůžu přijít na to proč, takže kód
foreach($_GET as $index=>$get){$_GET[$index] = mysql_real_escape_string(htmlspecialchars($get));} by nefungoval jak má (a to i kdyby tam byla ta funkce pro DB samotná bez HTMLSpecialChars) ale toto foreach($_GET as $index=>$get){$_GET[$index] = htmlspecialchars($get);} je částečně to co jsem chtěl, takže děkuji Ernie za kód a Tori za info co ty funkce vlastně dělají, takže by se to mohlo už brát jako vyřešené, i když důvod proč "mysql_real..." nefunguje mě docela zajímá. |
||
Tori Profil |
#6 · Zasláno: 5. 6. 2011, 01:00:46
DarkMeni:
„"mysql_real_escape string($get)" všechno zkazí a nic nevrátí a nijak nemůžu přijít na to proč“ Musela jsem kouknout do manuálu, ale zřejmě to bylo tím, že v té době ještě nebylo navázané spojení s databází. Já tu funkci vždycky používám až při skládání sql dotazu, tak jsem zapomněla, že se řídí znakovou sadou nastavenou pro aktuální připojení k databázi. |
||
DarkMeni Profil |
#7 · Zasláno: 5. 6. 2011, 12:49:25
Měla jste pravdu, jen co jsem prohodil pořadí připojení k DB a zabezpečení GETU tak už to jde i s mysql_real_escape_string, děkuju :)
|
||
Časová prodleva: 13 let
|
0