Autor Zpráva
DarkMeni
Profil
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
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
<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
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
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
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
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0