Autor Zpráva
Leo
Profil
Měl jsem nedávno debatu o XSS a zazněl dotaz, jestli není možné prostě v určité části HTML vypnout vykonávání JavaScriptu, a to ne nastavením klienta, ale programově v html kódu. Idea je takové - pokud Vám někdo nějakým obskurním způsobem propašuje JS do kodu stránek (např. při vkládání komentáře k článku), pak ten kód obalím prvkem s patřičným atributem a JS kod v něm se bere jako HTML a nevykona se. Pokud vím nic takového neexistuje, ani se v HTML5 nechystá. Takže moje otázka - je něco takového technicky možné? Pokud ano, proč se to nepoužívá, resp. kde je závada v úvaze? Leo
Radek9
Profil
Leo:
Je možné to pomocí PHP funkcí smazat, ale čistě pomocí HTML ne, jak sám říkáš.
Leo
Profil
No to je mi jasné, že můžu v serverovém skriptu kontrolovat vstup (minimálně předtím, než jde do html výstupu) a taky se to musí dělat, jenže závadnost kódu je daná plejádou KLIENTů a jejich chyb a specifik (kód se v jednom vykoná, v jiném ne) a hlídat všechno je hodně náročná záležitost. Stačí se podívat na XSS a všechny možnosti jak JS kód může vypadat a kde všude se může objevit. Takže by se to řešilo na straně html... Leo
habendorf
Profil
Leo:
pak ten kód obalím prvkem

Textarea?
Nj, já vím, na prd ...
Carrot
Profil *
Leo:
jenže závadnost kódu je daná plejádou KLIENTů a jejich chyb a specifik
Co je to za divnou logiku? Prostě budeš ecsapovat/nahrazovat řídicí znaky - bohatě stačí htmlspecialchars, který zneškodní případný <script>. Jinak existují ekvivalenty i pro samotný Javascript - i když tam to má význam jen když necháš klienta definovat vnitřek nějakého stringu.
Leo
Profil
Carrot:

"bohatě stačí htmlspecialchars, který zneškodní případný <script>"

Jo? A co treba <img src="javascript:alert('ok')"> a podobné, horší, věci. JS není jen ve značce skript. Vygooglete si něco víc o XSS. Leo
Carrot
Profil *
Leo:
co treba <img src="javascript:alert('ok')"> a podobné, horší, věci.
Dobrá, htmlspecialchars zneškodní i <img> a jakýkoliv jiný tag. A nikde jinde už javascript být nemůže.
Leo
Profil
Carrot:

"Dobrá, htmlspecialchars zneškodní i <img> a jakýkoliv jiný tag. A nikde jinde už javascript být nemůže."

Fajn, takhle se můžeme bavit donekonečna. Protože javascript ve vstupu musíte ošetřit i tam, kde uživatel zadává pseudokód, ne přímo html tagy, jako například u této diskuse. Pak Vám strip_tags a htmlspecialchars nepomuze. Zůstal bych u původního dotazu - je technicky možné naprogramovat prohlížeč tak, aby prostě žádný js v dané části html nespouštěl, a pokud ano, stačilo by to k ošetření XSS? Leo
Joker
Profil
Leo:
Jo? A co treba <img src="javascript:alert('ok')"> a podobné, horší, věci.
Jelikož htmlspecialchars by zaentitovalo i <img>, žádný problém.

Větší problém by byl nechat ostatní HTML a filtrovat jen XSS, pak bych asi použil pár nahrazení podle regulárních výrazů
1. Zaentitovat "<" u <script> a </script> Možná takhle: <(?=\s*/?\s*script) nahradit za: < (mělo by vzít i < script> apod.)
2. Podobně jako 1. zaentitovat všechny značky, které v názvu tagu mají něco jiného než písmena a čísla. Ještě bezpečnější by bylo zaentitovat všechno, co v názvu tagu má něco jiného než nějaký povolený seznam (seznam platných HTML tagů ve formátu pro skript určitě půjde najít).
3. U vstupů kde je nutné hlídat XSS většinou není potřeba uživatelům dovolovat nějaké neobvyklé vychytávky, takže bych definoval množinu řetězců, kterými mohou začínat atributy href a src ("http://", "/", pro href ještě "?", "#", "mailto:", plus případné předdefinované adresáře a skripty, jako "img/" apod.) a všechno ostatní smazal.
Poznámka: atribut "src" bych hledal jako (cokoliv)src, čímž by se vyřešily i věci jako <img lowsrc="xss"> apod.
Leo
Profil
Joker:

Vidíte, můj původní dotaz (který trvá) byl právě o tom, jestli by tahle džungle šla obejít. Nezajimá mě, jak kontrolovat vstupy abych předešel XSS. Leo
habendorf
Profil
Leo:

Jestli tomu dobře rozumím, ty prostě hledáš nějaký prvek, v němž bys rád na úrovni html kódu zakázal skriptování, jakýsi obalovací
<div scripting="disabled"></div>


Nic takového AFAIK neexistuje.
Leo
Profil
habendorf:

Rozumíš tomu dobře, a to, že něco takového neexistuje. Ptám se, proč to neexistuje, například to není technicky možné vzhledem k tomu, jak se js v prohlížeči zpracovává? Nebo i kdyby to existovalo tak to XSS neřeší? Leo
Chamurappi
Profil
Reaguji na Lea:
Kdyby existovala nějaká „vypínací“ značka (či atribut), stejně by programátor musel ošetřit situaci, kdy by se tvůrce zákeřného kódu rozhodl ukončit ten vypínací element.

nic takového neexistuje
Explorer podporuje atribut security="restricted" na <iframu>. Stránka načtená dovnitř pak běží v jiné zóně, nejede v ní JS, ActiveX atd. — je to vlastně přesně to, co chceš.

ani se v HTML5 nechystá
Se zaváděním podobné novinky by byl docela problém — představovala by částečné bezpečnostní riziko, dokud by nevymřely starší verze prohlížečů, zatímco by specifikace naopak uklidňovala, že toto je správná cesta.

Protože javascript ve vstupu musíte ošetřit i tam, kde uživatel zadává pseudokód, ne přímo html tagy, jako například u této diskuse.
Povolujeme jen protokol http(s), žádný problém. Žádná kontrola není problém.

Obecně mi připadá nesmyslné plácnout jen tak do HTML zdroje (či do JS, do CSS, do adresy, do SQL dotazu…) něco, co mi posílá návštěvník. Vstup od uživatele by měl být vnímán v naprosto jiném kontextu — nejen proto, že by mohl být nebezpečný. Může být vadný i jiným způsobem a zařadit ho do důležitého místa bez patřičné kontroly je nezodpovědné. I kdyby šlo zabránit běhu skriptů, pořád může natropit paseku jeden neuzavřený <div>.


Reaguji na Jokera:
(mělo by vzít i < script> apod.)
S mezerou to už není HTML značka. Stačí rušit „<script“ (při čemž nezáleží na velikosti písmen).

Podobně jako 1. zaentitovat všechny značky, které v názvu tagu mají něco jiného než písmena a čísla.
Tím „názvem tagu“ myslíš asi celou počáteční značku, ne? Protože název ani nemůže obsahovat nic jiného než písmena a čísla.

Zajímavá finta také je, když se nahradí „ on“ za „ o&#110;“ — názvy atributů událostí to efektivně rozbije, ale viditelný obsah se nenaruší :-)
Ale rozumnější je skutečně mít ten seznam dovolených elementů/atributů.
Leo
Profil
Chamurappi:

Diky, konečně :-) Zvlášť za security restricted. S postupným zaváděním by samozřejmě byl problém, a je mi jasné, že v dobách když HTML začínalo nebylo nic takového potřeba - vypadá to nesmyslně vypínat js v části stránky, zvlášť když to není stránka cizí. Leo

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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