Upozornění na xss. (25 znaků)

uzziel
Člen | 46
+
-4
-

https://doc.nette.org/cs/http/request#…

U funkce $httpRequest->getQuery(‚id‘) hrozí xss, jelikož hodnota není escapovaná a dokumentace na to neupozorňuje.

Odzkoušeno na nette 3.0

jiri.pudil
Nette Blogger | 1028
+
+4
-

Ahoj,

jelikož hodnota není escapovaná

jak by sis představoval, že bude escapovaná?

Escapovat je třeba na výstupu (až tehdy vím z kontextu, jakým způsobem to provést), nikoliv na vstupu – ten naopak chci tak, jak mi ho uživatel zadal.

uzziel
Člen | 46
+
-4
-

Spíš jen upozorňuji, že tam chybí informace o chybějící escapovaní, protože s danou hodnotou se nemusí pracovat jen v latte.

Marek Bartoš
Nette Blogger | 1146
+
+5
-

Escapování je context-specific – pro xml, html, css, js i databázi je potřeba escapovat jinak. Escapovat se musí vždy teprve tam, kde se hodnota vypisuje či používá, jinak escapování postrádá smysl. Takže jde vždy o záležitost šablonovacího či databázového systému aj. které s daným kontextem pracují.

Editoval Mabar (18. 2. 2020 14:24)

chemix
Nette Core | 1294
+
+2
-

Ahoj @uzziel muzes prosim napsat tvuj usecase, kdy jsi na problem narazil? Pokud sis takhle sahal pro data co jsi s nima chtel delat?

uzziel
Člen | 46
+
-3
-

Mabar napsal(a):

Escapování je context-specific – pro xml, html, css, js i databázi je potřeba escapovat jinak. Escapovat se musí vždy teprve tam, kde se hodnota vypisuje či používá, jinak escapování postrádá smysl. Takže jde vždy o záležitost šablonovacího či databázového systému aj. které s daným kontextem pracují.

Já zde upozorňuji na chybějící informaci o escapování a ty argumentuješ, že escapování záleží na tom, kde se hodnota používá.

Marek Bartoš
Nette Blogger | 1146
+
0
-

Já zde upozorňuji na chybějící informaci o escapování a ty argumentuješ, že escapování záleží na tom, kde se hodnota používá.

Otázkou je, proč by měla být ecapovaná hodnota z funkce, jejíž výstup většinou vůbec escapovaný mít nechci a jak by to vlastně mělo fungovat, když bez vědomí toho, kde se hodnota používá nevíš, jak ji escapovat správně.

Pokud se však snažíš říct, že se z funkce mohou vrátit nějaká zcela nevalidní data, tak by to měla řešit RequestFactory a závadná data odfiltrovat nebo odmítnout request, nic co by měl řešit getter v Request.

Ideální by bylo dát sem ukázku, u jakých dat hrozí XSS a případně kde je používáš.

Editoval Mabar (18. 2. 2020 14:56)

uzziel
Člen | 46
+
0
-

chemix napsal(a):

Ahoj @uzziel muzes prosim napsat tvuj usecase, kdy jsi na problem narazil? Pokud sis takhle sahal pro data co jsi s nima chtel delat?

url: localhost/hledej?id=<b>qq

public function renderHledej()
{
  	$id = $this->request->getQuery('id');

	var_dump($id);
	// string(5) "<b>qq" <== klasické html zobrazení; alert taky funguje; sql jsem netestoval

	// logSomeHowHledejData($id);
}
uzziel
Člen | 46
+
-9
-

Mabar napsal(a):

Já zde upozorňuji na chybějící informaci o escapování a ty argumentuješ, že escapování záleží na tom, kde se hodnota používá.

Otázkou je, proč by měla být ecapovaná hodnota z funkce, jejíž výstup většinou vůbec escapovaný mít nechci a jak by to vlastně mělo fungovat, když bez vědomí toho, kde se hodnota používá nevíš, jak ji escapovat správně.

Pokud se však snažíš říct, že se z funkce mohou vrátit nějaká zcela nevalidní data, tak by to měla řešit RequestFactory a závadná data odfiltrovat nebo odmítnout request, to určitě není záležitost getteru v Request.

deální by bylo dát sem ukázku, u jakých dat hrozí XSS a případně kde je používáš.

Snažím se říct, že by v dokumentaci měla být poznámka, že se jedná o neescapováná data!

MajklNajt
Člen | 470
+
+4
-

@uzziel a oni sa ti len snažia vysvetliť, že escapovanie v tejto časti aplikácie nie je žiaduce, že escapovanie sa rieši v iných vrstvách – prečo by to teda malo byť uvedené v dokumentácií ako špeciálne upozornenie? máš nejaký use-case, ako sa už pýtal @chemix, kedy ti tieto neescapované dáta robia problém?

Editoval MajklNajt (18. 2. 2020 15:22)

uzziel
Člen | 46
+
-5
-

MajklNajt napsal(a):

@uzziel a oni sa ti len snažia vysvetliť, že escapovanie v tejto časti aplikácie nie je žiaduce, že escapovanie sa rieši v iných vrstvách – prečo by to teda malo byť uvedené v dokumentácií ako špeciálne upozornenie? máš nejaký use-case, ako sa už pýtal @chemix, kedy ti tieto neescapované dáta robia problém?

Posílám data do API, kterou nemám pod kontrolou a proto potřebuji mít jistotu, že posílám escapováná data. Ne řešit, kde a jak se data mají escapovat.

chemix
Nette Core | 1294
+
0
-

@uzziel a co kdyz delam na aplikaci ktera chce ukladat i z tveho pohledu nebezpecna data? Jde mi o to, ze muzu mit usecase, kde nechci, aby mi framework zahodil script tag, protoze je to žádana vec, chci si ho ulozit. Takze pak by pro me problem byl ze framework zahazuje data.

To nette imho nedela. Do dat se ti dostanou ty co uzivatel poslal. Ty dostanes do promene a pak dal je treba s tim umet pracovat. Pokud chces neco ulozit do databaze tak se musis ty rozhodnout zda to tam posles ciste to co uzivatel poslal nebo si to nejak vice procistis. Latte je pak silny pomocnik v tom ze kdyz tohle moc neresis tak se ti snazi maximalne pomoci tim ze v kontextu escapuje texty tak aby nebyly nebezpecne a pokud to potrebujes jinak tak si s tim musim uz pak trosku vice pohrat.

Snad to vysvetluji spravne.

Predstav si ze mas vstup zadejte barvu. Ale ty chces pak tu barvu zobrazovat jako barvu semaforu, takze chces zobrazit zelenou nebo cervenou, a ted je otazka vadi ti kdyz ti uzivatel na otazku zadejte barvu a nevedel co se s ni bude delat zadal modrou? Nikdo jiny, ani framework za tebe neudela chytrou analyzu toho ze chces po nem aby ti zadal zelenou nebo cervenou a o zbytek situaci se postarat. V databazi kdyz bude ulozena modra nicemu nevadi. A pri vypisu je latte tak chytre ze misto midre tam da defaultne cervenou aby nenastal problem. Pokud chces jine chovani tak ty jsi programtor a musis to tu aplikaci naucit.

Chapu ze z nejakeho uhlu pohledu je pro tebe chybejici informace, ze ty data nejsou escapovana chybna. A je mozna jen otazka vety, kterou nevim jak by mela znit, ze data jsou ciste to co uzivatel zadal, snad jen trimovana? (Ted si nejsem jisty)

Napada te ta veta? Jak by mela znit aby ti dava smysl a hlavne tu informaci ze ziskas vše co uživatel zadal do inputu/nebo url

chemix
Nette Core | 1294
+
0
-

@uzziel asi spis hledas termin validace dat

uzziel
Člen | 46
+
-9
-

Hoši, zkuste si jednou postavit multiplatformní apku s velkým objemem dat (ale o big data nejde).

uzziel
Člen | 46
+
0
-

chemix napsal(a):

@uzziel asi spis hledas termin validace dat

Validace, escapování, to je jedno.

Jen jsem se taky snažil dát info, že getQuery nedává escapováná data a nějaké info by sedlo.

A nějak se to nechytlo.

MajklNajt
Člen | 470
+
0
-

@uzziel ale to je práve tvoja úloha, aby si sa ty o tieto veci staral… prečo napr. PHP defaultne vypína Magic Quotes? pretože chceš holé dáta, nechceš, aby ti na ne niečo šahalo…

uzziel
Člen | 46
+
0
-

MajklNajt napsal(a):

@uzziel ale to je práve tvoja úloha, aby si sa ty o tieto veci staral… prečo napr. PHP defaultne vypína Magic Quotes? pretože chceš holé dáta, nechceš, aby ti na ne niečo šahalo…

Kdyby o tom byla v dokumetaci zmínka, tak si napíšu hned vlastní funkci.

chemix
Nette Core | 1294
+
+1
-

@uzziel nemusis, uz tam jsou, ale hledej “validace”

MajklNajt
Člen | 470
+
0
-

dokumentácia nette resp. latte ťa upozorňuje, kedy dáta escapuje, napr. tu https://latte.nette.org/cs/guide#… – prečo by mala upozorňovať na všetky ostatné prípady, kedy to nerobí?

Kamil Valenta
Člen | 752
+
+2
-

uzziel napsal(a):

Hoši, zkuste si jednou postavit multiplatformní apku s velkým objemem dat (ale o big data nejde).

Jistě, protože tady všichni máme zkušenosti jen s „Hello, world!“, ale naštěstí nám tu a tam někdo na fóru otevře oči.

Taky jsi mohl použít

public function renderHledej(int $id) {
    dump($id);
}

Ale Ty ses rozhodl sahat na holý request po holém getQuery a divíš se, že to není sanitizováno?

uzziel
Člen | 46
+
-3
-

MajklNajt napsal(a):

dokumentácia nette resp. latte ťa upozorňuje, kedy dáta escapuje, napr. tu https://latte.nette.org/cs/guide#… – prečo by mala upozorňovať na všetky ostatné prípady, kedy to nerobí?

Pracuji s daty o úroveň výš, ne až v latte.

uzziel
Člen | 46
+
-6
-

kamil_v napsal(a):

uzziel napsal(a):

Hoši, zkuste si jednou postavit multiplatformní apku s velkým objemem dat (ale o big data nejde).

Jistě, protože tady všichni máme zkušenosti jen s „Hello, world!“, ale naštěstí nám tu a tam někdo na fóru otevře oči.

Taky jsi mohl použít

public function renderHledej(int $id) {
    dump($id);
}

Ale Ty ses rozhodl sahat na holý request po holém getQuery a divíš se, že to není sanitizováno?

Pokud něco beru skrz framework funkci, tak čekám, že bude umět více než jen holé return $_GET[‚id‘].

uzziel
Člen | 46
+
+2
-

chemix napsal(a):

@uzziel nemusis, uz tam jsou, ale hledej “validace”

Podívám se.

David Matějka
Moderator | 6445
+
+1
-

Pokud něco beru skrz framework funkci, tak čekám, že bude umět více než jen holé return $_GET[‚id‘].

vraci to validni utf8 vstup. to, jak s nim nalozis, je na tobe. nejake escapovani je zcela out of scope teto vrstvy. a pokud by to melo escapovat, tak jak? pro html? sql? js? css?

a stejne tak asi neocekavas, ze dostanes escapovana data, kdyz polozis dotaz databazi. nebo kdyz prectes soubor z disku. nebo kdyz provedes api call.

vsechny vstupy do aplikace bys mel implicitne pokladat za nebezpecne.

Posílám data do API, kterou nemám pod kontrolou a proto potřebuji mít jistotu, že posílám escapováná data. Ne řešit, kde a jak se data mají escapovat.

a do api se escapuji data jak?

uzziel
Člen | 46
+
-9
-

David Matějka napsal(a):

Pokud něco beru skrz framework funkci, tak čekám, že bude umět více než jen holé return $_GET[‚id‘].

vraci to validni utf8 vstup. to, jak s nim nalozis, je na tobe. nejake escapovani je zcela out of scope teto vrstvy. a pokud by to melo escapovat, tak jak? pro html? sql? js? css?

a stejne tak asi neocekavas, ze dostanes escapovana data, kdyz polozis dotaz databazi. nebo kdyz prectes soubor z disku. nebo kdyz provedes api call.

vsechny vstupy do aplikace bys mel implicitne pokladat za nebezpecne.

Posílám data do API, kterou nemám pod kontrolou a proto potřebuji mít jistotu, že posílám escapováná data. Ne řešit, kde a jak se data mají escapovat.

a do api se escapuji data jak?

Vždyť do getQuery() stačí dat druhý parametr $EscapeFor s defaultem noescape. Následně udělat escapy pro nejzákladnější vrstvy a vyřeší to x věci.

Tímto bych to ukončil. Díky za odpovědi, mínusy a snad někdy příště.

CZechBoY
Člen | 3608
+
0
-

O kontextech zde už bylo psáno hodně, a tak se zeptám ještě jednou.
Když zadám $escaped_abcdef = $url->getQuery('abcdef', true /* escape=true */); tak budu mít parametr vyescapovaný pro

  1. url
  2. uri
  3. email
  4. databázi mysql
  5. databázi mysql LIKE
  6. javascript (json)
  7. yaml
  8. html
  9. xml
  10. css
  11. shell
  12. php proměnná

Pro ukázku myslím stačí tento zlomek kontextů ve kterých můžu danou proměnnou/parametr použít.

Editoval CZechBoY (18. 2. 2020 18:10)

MajklNajt
Člen | 470
+
+1
-

@CZechBoY zbytočne kŕmiš trolla…

uzziel
Člen | 46
+
-3
-

MajklNajt napsal(a):

@CZechBoY zbytočne kŕmiš trolla…

Slušně jsem napsal svůj pohled na dokumentaci (co by, z mého pohledu, bylo fajn přidat). Slušně jsem dál argumenty na stůl a slušně odpovídal.

Tak si tyto kécy nech.

uzziel
Člen | 46
+
-3
-

CZechBoY napsal(a):

O kontextech zde už bylo psáno hodně, a tak se zeptám ještě jednou.
Když zadám $escaped_abcdef = $url->getQuery('abcdef', true /* escape=true */); tak budu mít parametr vyescapovaný pro

  1. url
  2. uri
  3. email
  4. databázi mysql
  5. databázi mysql LIKE
  6. javascript (json)
  7. yaml
  8. html
  9. xml
  10. css
  11. shell
  12. php proměnná

Pro ukázku myslím stačí tento zlomek kontextů ve kterých můžu danou proměnnou/parametr použít.

Asi takto – pokud latte escapuje html, proč by vrstva nad ní nemohla druhým parametrem escapovat/validovat základní věci v getQuery()?

Kamil Valenta
Člen | 752
+
+1
-
  • protože latte už ví, že má escapovat pro html
  • vrstva nad ní neví nic, co když bude escapovat pro html a ty parametr použiješ v sql?
  • a co jsou „základní věci“? a když je definuješ, budou základní i pro mě?
Kamil Valenta
Člen | 752
+
+1
-

uzziel napsal(a):

Pokud něco beru skrz framework funkci, tak čekám, že bude umět více než jen holé return $_GET[‚id‘].

Vidíš… a přitom je hromada getterů, které kvůli principu zapouzdření nedělají nic jiného, než že vrací holý atribut. A já to od nich dost čekám. Když chci s atributem čarovat dál, použiju patřičnou jinou metodu.

uzziel
Člen | 46
+
-2
-

kamil_v napsal(a):

uzziel napsal(a):

Pokud něco beru skrz framework funkci, tak čekám, že bude umět více než jen holé return $_GET[‚id‘].

Vidíš… a přitom je hromada getterů, které kvůli principu zapouzdření nedělají nic jiného, než že vrací holý atribut. A já to od nich dost čekám. Když chci s atributem čarovat dál, použiju patřičnou jinou metodu.

Vy jste jak staří dědci, kteří odmítaji diskutovat nad něčím novým (hlavně dát mínusy a kopat kolem sebe). A pak se dívite, že Nette stagnuje – resp. pomalu firmy začínaji pracovat s jiným frameworkem.

chemix
Nette Core | 1294
+
0
-

Achjo :-/

Marek Bartoš
Nette Blogger | 1146
+
+2
-

Ty jsi ale arogantní vůl.

nette/http komunikaci zapouzdřuje a stará se o escapování a filtrování dat takovým způsobem, aby jsi vždy dostal validní UTF-8 data. To že chceš escapované html je naprostá kravina, kterou nemá naprosto žádná http vrstva a o tom se sám můžeš přesvědčit, kdyby ses místo těch keců podíval do dokumentace symfony, laravelu, nodejs express nebo kteréhokoli jiného frameworku, který se namísto nette používá.

Napsal jsi, že posíláš data na api, kterou nemáš pod kontrolou a u které potřebuješ mít jistotu, že jí posíláš escapovaná data. Jestli si ta api nedokáže zvalidovat svá vlastní data, tak bude problém spíš v ní, nemyslíš?

Zaměřil jsi se tady konkrétně na metodu getQuery(). Všiml sis toho, že ani ostatní metody tebou vytoužené esacapování nemají? Třeba getPost()? Ze kterého se získávají data zaslaná formulářem? Uvědomuješ si, že ten formulář může obsahovat článek z redakčního systému, který používá html?

Escapování na nesprávném místě přináší více starostí než užitku. Ale jestli si i přese snahu všech tady myslíš, že máš pravdu ty, tak přeju hodně štěstí s nalezením jiného frameworku. Nebo lépe, ušetři si čas a napiš si vlastní. Protože jenom ty máš pravdu a ostatní diskutující tady jsou jen školáčci, co sotva zvládli napsat hello world.

David Grudl
Nette Core | 8082
+
+9
-

Přesouvám do koše a zamykám.