Jak se chránit pro XSS útoku na php serveru?

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #30 kdy: 10. 10. 2019, 19:29:25 »
Nejsem zrovna expert ale jen pár znaků nemusí stačit, podle toho kde se text používá jich může být víc.
Pěkně popsaná nějaká ta pravidla prevence XSS např. zde:
https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html

Navíc jenom eskepování/ořezávání nemusí stačit. Je vhodné nebo dokonce nutné data obalit například pokud se uživatelská data použijí třeba jako hodnota atributu je třeba tam okolo vrazit uvozovky (také je popsáno v odkazu výše).
Obzvláště pokud to píšeš ručně, tak je třeba si dát pozor.

S tím souvisí i ukládání a načítání dat do souborů/databází - platí podobná pravidla - záleží zda se data nějak parsují (jak při ukládání tak při čtení, nebo případně includování, někdy si člověk ani neuvědomí co všechno fuguje jako parser).
Jen je třeba nezapomenout že to je často druhý, samstatný problém. To že se data správně uloží/načtou neznamená že se mohou vložit kamkoliv do html, escapovací pravidla bývají jiná.
Z toho také plyne že i když se vyhneme eskejpování/čištění při ukládání do databáze pomocí bindingu - viz prepared statementy co zmiňuje Kit, tak to ještě nechrání před XSS!

Jinak řečeno, je třeba eskejpovat/ořezávat a obalovat(např ty uvozovky) podle toho kde/jak jsou data použita.
Takže je potřeba ošetřit data jak při vstupu od uživatele(aby "nehaknul" stránky/databázi/server), tak na i výstupu směrem k uživateli (což je ta prevence XSS)

P.S. Speciálně pokud ukládáš do souboru tak není dobrý nápad nechat uživatele ovlivňovat název souboru na serveru, bezpečnější je si název vygenerovat a uživatelský název mít uložen bokem.


Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #31 kdy: 11. 10. 2019, 15:32:58 »
S tím souvisí i ukládání a načítání dat do souborů/databází - platí podobná pravidla - záleží zda se data nějak parsují (jak při ukládání tak při čtení, nebo případně includování, někdy si člověk ani neuvědomí co všechno fuguje jako parser).

Parsery si vždycky píšu vlastní, rychlejší než ty co jsou defaultně zabudované v php. Jako oddělovač nejčastěji používám \n, \t ale uvažuju i o použití speciálních znaků tam kde user nevkládá vstupy. Napsal jsem si například funkci, která převádí číslo na zakódovaný string (něco jako intval, ale má ord. rozsah 32-254). Výhodou je to, že i velké id se zkrátí na 4-5 bajtů. Jak ale čísla oddělit? Tak mě napadlo buď 255 (protože 255 pro id nikdy nepoužívám) nebo \r.

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #32 kdy: 11. 10. 2019, 15:46:44 »
Parsery si vždycky píšu vlastní, rychlejší než ty co jsou defaultně zabudované v php. Jako oddělovač nejčastěji používám \n, \t ale uvažuju i o použití speciálních znaků tam kde user nevkládá vstupy. Napsal jsem si například funkci, která převádí číslo na zakódovaný string (něco jako intval, ale má ord. rozsah 32-254). Výhodou je to, že i velké id se zkrátí na 4-5 bajtů. Jak ale čísla oddělit? Tak mě napadlo buď 255 (protože 255 pro id nikdy nepoužívám) nebo \r.

Přesně tohle je vlákno příspěvků které sráží věrohodnost tohoto serveru pro mě až na dno :O(
Uživatel zaregistrován těsně před založením vlákna, nikam jinam nepřispívá a vede to přesně tak aby vyvolával kontroverze a provokoval. Bohužel je to tu opravdu časté i přes povinnou registraci :O(

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #33 kdy: 11. 10. 2019, 17:45:57 »
Parsery si vždycky píšu vlastní, rychlejší než ty co jsou defaultně zabudované v php. Jako oddělovač nejčastěji používám \n, \t ale uvažuju i o použití speciálních znaků tam kde user nevkládá vstupy. Napsal jsem si například funkci, která převádí číslo na zakódovaný string (něco jako intval, ale má ord. rozsah 32-254). Výhodou je to, že i velké id se zkrátí na 4-5 bajtů. Jak ale čísla oddělit? Tak mě napadlo buď 255 (protože 255 pro id nikdy nepoužívám) nebo \r.

Přesně tohle je vlákno příspěvků které sráží věrohodnost tohoto serveru pro mě až na dno :O(
Uživatel zaregistrován těsně před založením vlákna, nikam jinam nepřispívá a vede to přesně tak aby vyvolával kontroverze a provokoval. Bohužel je to tu opravdu časté i přes povinnou registraci :O(

Copak tě trápí, svěř se nám.

Mlocik97

  • *****
  • 830
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #34 kdy: 11. 10. 2019, 18:15:51 »
Framework s tím nedělá vůbec nic, jen to předá dál.

Kecáš nezmysel, a ešte jak to môžeš takto všeobecne povedať, frameworkov je miliarda. Nezáleží náhodou ktorý použiješ?


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #35 kdy: 11. 10. 2019, 22:11:10 »
Framework s tím nedělá vůbec nic, jen to předá dál.
Kecáš nezmysel, a ešte jak to môžeš takto všeobecne povedať, frameworkov je miliarda. Nezáleží náhodou ktorý použiješ?

Kvalitní framework to skutečně jen předá dál do databáze přes prepared statements. Nic víc s tím totiž není třeba dělat. Databázové ovladače není radno obcházet.

Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.

Mlocik97

  • *****
  • 830
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #36 kdy: 11. 10. 2019, 22:57:46 »
mikto nehovorí o obchádzaní driverov, ale než sa zavolá funkce driveru, tak proč by framework nepripravil data do bezpečnej podoby? Teda zabránil SQL injection a pod? Podla mňa je mnoho kvalitných frameworkov ktoré robia aj toto, a považujem ich za kvalitné a správne riešené.

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #37 kdy: 12. 10. 2019, 01:10:37 »
Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.

Myslíš jako pomocí DOMDocument? nebo něco jiného?
Ideálně prosím dej nějaký příklad kde se to používá.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #38 kdy: 12. 10. 2019, 11:11:40 »
mikto nehovorí o obchádzaní driverov, ale než sa zavolá funkce driveru, tak proč by framework nepripravil data do bezpečnej podoby? Teda zabránil SQL injection a pod? Podla mňa je mnoho kvalitných frameworkov ktoré robia aj toto, a považujem ich za kvalitné a správne riešené.

Protože tohle už ten DB driver dělá, sám se efektivně brání proti SQL injection.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #39 kdy: 12. 10. 2019, 11:19:32 »
Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.
Myslíš jako pomocí DOMDocument? nebo něco jiného?
Ideálně prosím dej nějaký příklad kde se to používá.

Ano, mám na mysli DOMDocument. Vyleze z toho hotové XML či HTML, kde jsou potenciálně nebezpečné znaky řádně transformovány do entit.

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #40 kdy: 12. 10. 2019, 14:00:18 »
Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.
Myslíš jako pomocí DOMDocument? nebo něco jiného?
Ideálně prosím dej nějaký příklad kde se to používá.

Ano, mám na mysli DOMDocument. Vyleze z toho hotové XML či HTML, kde jsou potenciálně nebezpečné znaky řádně transformovány do entit.
DOMDocument je možná bezpečnější, ale to "lepší" se mi moc nezdá (spotřeba paměi,výkon,nutnost kompletního DOMu před odesláním na clienta).
Navíc transformace DOMu se dost liší od běžného použití php jako preprocesoru. To už mi přijde "lepší" použít nějaký framework, než toto.Ale to už jsme mimo téma.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #41 kdy: 12. 10. 2019, 14:56:11 »
Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.
Myslíš jako pomocí DOMDocument? nebo něco jiného?
Ideálně prosím dej nějaký příklad kde se to používá.
Ano, mám na mysli DOMDocument. Vyleze z toho hotové XML či HTML, kde jsou potenciálně nebezpečné znaky řádně transformovány do entit.
DOMDocument je možná bezpečnější, ale to "lepší" se mi moc nezdá (spotřeba paměi,výkon,nutnost kompletního DOMu před odesláním na clienta).
Navíc transformace DOMu se dost liší od běžného použití php jako preprocesoru. To už mi přijde "lepší" použít nějaký framework, než toto.Ale to už jsme mimo téma.

Příznivci funkcionálního programování zde mají příležitost, jak se vyřádit. Nutnost kompletního DOMu nevidím jako překážku, jen málo úloh při tom vyžaduje víc než 1 MB. Obvykle to jsou jen desítky až stovky KB, se kterými si hravě poradí v malých jednotkách ms. Odezva je tedy řádově rychlejší než u běžných frameworků. Pokud bys ten DOM nechtěl generovat naráz, tak nemusíš. Uděláš jednu větev, exportuješ, uděláš další, exportuješ,... Efektivnější je však vygenerovat vše naráz, nemusíš tak plýtvat drahým echem. Po odladění jen vypneš odsazování. Navíc se v XML, které dostaneš navíc jako bonus, hledají chyby mnohem snáze než v HTML.

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #42 kdy: 12. 10. 2019, 17:44:07 »
Při prezentaci je zase nutné předat data do HTML, proto se obvykle používá funkce htmlspecialchars(). Z mého pohledu je poněkud zastaralá - PHP nabízí lepší, objektové řešení, u kterého už nemusím přemýšlet nad typem eskejpování v daném kontextu.
Myslíš jako pomocí DOMDocument? nebo něco jiného?
Ideálně prosím dej nějaký příklad kde se to používá.
Ano, mám na mysli DOMDocument. Vyleze z toho hotové XML či HTML, kde jsou potenciálně nebezpečné znaky řádně transformovány do entit.
DOMDocument je možná bezpečnější, ale to "lepší" se mi moc nezdá (spotřeba paměi,výkon,nutnost kompletního DOMu před odesláním na clienta).
Navíc transformace DOMu se dost liší od běžného použití php jako preprocesoru. To už mi přijde "lepší" použít nějaký framework, než toto.Ale to už jsme mimo téma.

Příznivci funkcionálního programování zde mají příležitost, jak se vyřádit. Nutnost kompletního DOMu nevidím jako překážku, jen málo úloh při tom vyžaduje víc než 1 MB. Obvykle to jsou jen desítky až stovky KB, se kterými si hravě poradí v malých jednotkách ms. Odezva je tedy řádově rychlejší než u běžných frameworků. Pokud bys ten DOM nechtěl generovat naráz, tak nemusíš. Uděláš jednu větev, exportuješ, uděláš další, exportuješ,... Efektivnější je však vygenerovat vše naráz, nemusíš tak plýtvat drahým echem. Po odladění jen vypneš odsazování. Navíc se v XML, které dostaneš navíc jako bonus, hledají chyby mnohem snáze než v HTML.
Mno, asi máš pravdu, ale pořád se nemůžu zbavit dojmu že u projektů kde bych uvažoval takhle přímo psát v php je to kanón na vrabce, a jde to proti "duchu" php, jak ho chápu já, cožje víceméně preprocesor pro html s možností doplnit o nějaký ten kód, čtení z db atp.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #43 kdy: 12. 10. 2019, 18:24:55 »
DOMDocument je možná bezpečnější, ale to "lepší" se mi moc nezdá (spotřeba paměi,výkon,nutnost kompletního DOMu před odesláním na clienta).
Navíc transformace DOMu se dost liší od běžného použití php jako preprocesoru. To už mi přijde "lepší" použít nějaký framework, než toto.Ale to už jsme mimo téma.

Příznivci funkcionálního programování zde mají příležitost, jak se vyřádit. Nutnost kompletního DOMu nevidím jako překážku, jen málo úloh při tom vyžaduje víc než 1 MB. Obvykle to jsou jen desítky až stovky KB, se kterými si hravě poradí v malých jednotkách ms. Odezva je tedy řádově rychlejší než u běžných frameworků. Pokud bys ten DOM nechtěl generovat naráz, tak nemusíš. Uděláš jednu větev, exportuješ, uděláš další, exportuješ,... Efektivnější je však vygenerovat vše naráz, nemusíš tak plýtvat drahým echem. Po odladění jen vypneš odsazování. Navíc se v XML, které dostaneš navíc jako bonus, hledají chyby mnohem snáze než v HTML.
Mno, asi máš pravdu, ale pořád se nemůžu zbavit dojmu že u projektů kde bych uvažoval takhle přímo psát v php je to kanón na vrabce, a jde to proti "duchu" php, jak ho chápu já, cožje víceméně preprocesor pro html s možností doplnit o nějaký ten kód, čtení z db atp.

Naopak se mi jeví generování XML a HTML přes DOM velmi snadné a elegantní. V žádném případě se nejedná o kanón na vrabce. Dokonce můžeš importovat statické HTML, změnit libovolné nody a poslat na výstup v podstatě stejně jako v Javascriptu. Všechny šablonovací systémy se proti takové jednoduchosti použití mohou zahrabat. Kodérovi stačí, pokud umí HTML a Javascript.

V PHP si zpracuji vstup, načtu či modifikuji data v databázi, načtu šablonu, vložím do ní data, vyplivnu na výstup a hotovo. Vše má PHP v základní výbavě, frameworky nejsou potřebné. Je dobré, pokud použiješ architekturu MVC a budeš se držet zásad SOLID, které bývají ve frameworcích tak často porušovány.

Re:Jak se chránit pro XSS útoku na php serveru?
« Odpověď #44 kdy: 12. 10. 2019, 21:27:34 »
Naopak se mi jeví generování XML a HTML přes DOM velmi snadné a elegantní. V žádném případě se nejedná o kanón na vrabce. Dokonce můžeš importovat statické HTML, změnit libovolné nody a poslat na výstup v podstatě stejně jako v Javascriptu. Všechny šablonovací systémy se proti takové jednoduchosti použití mohou zahrabat. Kodérovi stačí, pokud umí HTML a Javascript.

V PHP si zpracuji vstup, načtu či modifikuji data v databázi, načtu šablonu, vložím do ní data, vyplivnu na výstup a hotovo. Vše má PHP v základní výbavě, frameworky nejsou potřebné. Je dobré, pokud použiješ architekturu MVC a budeš se držet zásad SOLID, které bývají ve frameworcích tak často porušovány.

Dovolil jsem si hodně zjednodušený příklad:

Varianta 1:
Kód: [Vybrat]
<?php
 $TextForInsert
='<script>alert(123)</script>';
?>

<html>
    <head>
        <title>PHP Test</title>
        </head>
    <body>
        <div id="TestID">
            <?php echo htmlspecialchars($TextForInsert); ?>
        </div>
    </body>
</html>

Varianta 2:
Kód: [Vybrat]
<?php
$TextForInsert='<script>alert(123)</script>';
?>


<?php
$HtmlTemplate 
= <<<'EOD'
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<div id="TestID">
</div>
</body>
</html>
EOD;
 
$dom = new DOMDocument();
 
$dom->loadHTML ($HtmlTemplate);
 
$dom->getElementById('TestID')->appendChild($dom->createTextNode($TextForInsert));
 echo 
$dom->saveHTML();
?>


V první variantě
 - je třeba zvolit správnou funkci podle toho kam se text vkládá

V druhé variantě
 - Je třeba získat správnou část DOMu
 - Je potřeba vytvořit nový element a vložit do DOm (funkce opět závislá na tom co a kam vkládám)

Pokud máš nějaký větší, složitější systém s více stránkami, sdíleným kódem, dynamickými templaty atp. , tak se druhá varianta asi vyplatí.
Ale pro pár jednoduchých stránek mi to přijde zbytčné. A za snadné a elegantní (oproti první variantě) bych to také trovna neoznačil.