Autor Zpráva
Jack Finger
Profil
Dobrý den,
tvořím ochranu proti útokům přes XSS a nemůžu přijít na to, jak udělat následující regulár:

$text = '<h1>test</h1>';
function replaceString($text){
  $from = "/<(\/)(.+){1,}>/i";
  $to = "&lt;\\1\\2&gt;\\3&lt;/\\2&gt;";
  $return = preg_replace($from, $to, $text);
  return $return;
}
echo replaceString($text);

tento příkald vypíše:
<h1>&lt;/h1&gt;&lt;/h1&gt;

a má vypsat:
&lt;h1&gt;test&lt;/h1&gt;

taktéž by měl fungovat, když nebude obsahovat slovo "test".
Mohl by mi prosím někdo pomoci?
Děkuji, Jack F.
Joker
Profil
Co použít raději htmlspecialchars()?
Jack Finger
Profil
zkoušel jsem, ale to mi udělalo z uvozovek &quot; a to nepotřebuju..
Joker
Profil
Tak co htmlspecialchars plus ENT_NOQUOTES?
(viz manuál)
Str4wberry
Profil
Odpovídám Jacku Fingerovi:
Tohle jsi četl: http://php.vrana.cz/cross-site-scripting.php?
Jack Finger
Profil
Joker
a když nechci přepisovat '&' ?

Str4wberry
pokud nejsem slepý, tak je tam jen o XSS a jak se bránit, ale to neřeší můj problém...?
Joker
Profil
Jack Finger
a když nechci přepisovat '&' ?
:o)))
Příští bude: "A když nechci přepisovat ani '>'?" :-D

V tom případě bych použil strtr.
Jack Finger
Profil
Příští bude: "A když nechci přepisovat ani '>'?" :-D
to ne ;o) jde mi jen o ochranu před XSS, tzn '<' a '>', znak '&' mi nijak web neohrozí.
když použiju strtr(), tak (příklad z manuálu) by to bylo:
$trans = array("ahoj" => "nazdar", "nazdar" => "ahoj");
echo strtr("nazdar lidi, řekl jsem ahoj", $trans);

ale to mi přepíše jen '<' a '>', ale co když uživatel napíše třeba řetězec 'udělal jsem to a to => dostal jsem na vysvědčení 1', pak se to přepíše taky a to já právě nepotřebuji, proto to řeším regulárem.
Joker
Profil
Jack Finger
Tak strip_tags? :-)

Mno, já jsem toho názoru, že když už to dělám, dělal bych to pořádně, ne "tak napůl". Standardní úprava textu do "korektního tvaru" pro vložení do HTML/XML je převést všechny výskyty tří znaků: <, >, &
Jack Finger
Profil
Joker
však právě pořádně to dělám, napůl by to bylo, kdybych převedl všechny tři a tudíž uživatel by neměl možnost psát znaky typu '=>','<=>','company & spol' apod...
strip_tags() umí smazat znak '<', znak '>' smaže jen pokud je do páru s '<'. ale já je nechci smazat, ale nahradit :oP
Jack Finger
Profil
Prostě mi stačí, kdyby mi někdo pomohl opravit můj původní regulár tak, aby fungoval. Důvody proč to tak dělám mám a o žádném jiném řešení nevím..
Chamurappi
Profil
Reaguji na Jacka Fingera:
V tom případě by mělo stačit nahrazování "/<([\\/\\?!]?[a-z])/i" za "&lt;\\1".
Edit: zapomněl jsem ještě na ukončovací značku a podobné věci. Snad jsem to správně vyescapoval.
DJ Miky
Profil
Je snad nějaký rozdíl, když by uživatel napsal <h1></h1> nebo a<b? Obojí by dělalo neplechu.

$trans = array("<" => "&lt;", ">" => "&gt;");
echo strtr("<h1> a<b<c <=> c>b>a </h1>", $trans);


To text ošetří, aby to znaky < a > bralo jako text (entity) a ne jako značky.
Jack Finger
Profil
Chamurappi
vypadá, že funguje jak má :o)

DJ Miky
Je snad nějaký rozdíl, když by uživatel napsal <h1></h1> nebo a<b?
ano, je. <h1></h1> by se dalo považovat za XSS, a<b za nerovnici, o možnost XSS by šlo v případě a<b>.
teď mě ale napadá, že buďto jsem zapomněl původní důvod, nebo mě teď nedošlo, že výsledek je stejný :oP v každém případě díky, už to funguje a kdyby mě napadlo, proč jsem to chtěl zrovna regulárem, tak napíšu. lol.. degenerace mozku...
Joker
Profil
Jack Finger
ano, je. <h1></h1> by se dalo považovat za XSS, a<b za nerovnici, o možnost XSS by šlo v případě a<b>.
A mohl byste mě poučit, jaký je rozdíl v dopadech?
Řekněme, že pošlu:
Lorem ipsum dolor <h1>sit amet consectetuer</h1> ut at urna sollicitudin eget.
a výsledkem bude (náznakově):
Lorem ipsum dolor sit amet consectetuer ut at urna sollicitudin eget.

A řekněme, že pošlu:
Lorem ipsum dolor sit amet, a<b, consectetuer ut at urna sollicitudin eget.
a výsledkem bude:
Lorem ipsum dolor sit amet, a

Myslíte, že to druhé je "méně špatně"?
Jack Finger
Profil
aha, už vím proč jsem to chtěl: když mám '->', tak v db mám sice '-&gt;' , ale na výstupu se mi zobrazí '-&amp;gt;'. nevím proč, každopádně Chamurappiho regulár funguje ok. díky.
Jack Finger
Profil
Joker
no dobře, zase dřív mluvím než zkouším. ach jo, co je to dneska za den, už radši mlčím.
Joker
Profil
Chamurappi
Myslím, že ten výraz by šel "hacknout" nějak takhle: <<script src="zlyskript.js">
Chamurappi
Profil
Reaguji na Jokera:
Mělo by vzniknout tohle: <&lt;script src="zlyskript.js"> — a to je OK, ne?
Joker
Profil
Chamurappi
Jo, to je pravda, ono se vlastně nahradí to druhé < ...tak nic :)

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