Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/8 33 82-0

Sharepoint und der eigensinnige XSS – Filter (Bericht)

Ein Teil unse­rer Kern­kom­pe­ten­zen im Umgang mit Sha­re­point, ist die Migra­tion von Alt­sys­te­men zu Sha­re­point. Ein aktu­el­les Pro­jekt stellte uns vor die Her­aus­for­de­rung, Inhalte, Sty­le­vor­ga­ben und Meta-Daten mit­tels XML Import aus einem bestehen­den Con­tent Manage­ment Sys­tem 1:1 nach Sha­re­Point zu über­neh­men. Beson­ders pro­ble­ma­ti­sch war dabei der Fakt, dass sich inner­halb der Daten Para­me­ter für die Busi­ness­lo­gik ver­steck­ten. Diese Logik mus­ste in Sha­re­Point zum Teil nach­ge­baut und beim Import berück­sich­tigt wer­den.

Eine Teil­auf­gabe des Imports bestand in der Über­nahme der eigent­li­chen Inhalte der Sei­ten. Diese lagen als bar­rie­re­freies HTML vor und muss­ten des­halb ori­gi­nal so in die Sha­re­Point Seite impor­tiert wer­den.

Meine Auf­gabe bestand nun darin, den ori­gi­na­len HTML Inhalt der zu migrie­ren­den Seite in eine Sha­re­point Seite zu impor­tie­ren. Mög­lichst soll­ten die Optik  (Sty­les, Bil­der, etc.) sowie der Inhalt (inkl. Links, Tabel­len etc.) unan­ge­tas­tet blei­ben.

Sha­re­point bie­tet dem geneig­ten Ent­wick­ler mit sei­ner API reich­lich Werk­zeug um diese Auf­gabe zu bewäl­ti­gen. So kann eine Seite ohne Pro­bleme mit fol­gen­den Pro­gramm­code ange­legt wer­den:

PublishingWeb currPublishingWeb = PublishingWeb.GetPublishingWeb(webContext); PublishingPageCollection pages = currPublishingWeb.GetPublishingPages(); PublishingPage currentPage = pages.Add(pageFileName, layout);

Auf diese Weise ist eine Publis­hing Page schnell erstellt. Soll diese jetzt auch noch mit Inhalt ver­se­hen wer­den, wird das SPField, das für den Inhalt einer Publis­hing­Page zustän­dig ist, benö­tigt.

Das SPField für Inhalte ist das Publis­hing­Pa­ge­Con­tent Field, das über die Fiel­dId Klasse ver­wen­det wer­den kann.

SPListItem newFileItem = newFile.Item; newFileItem[FieldId.PublishingPageContent] = htmlContent; newFileItem.Update();

Bis hier wurde alles ord­nungs­ge­mäß von Sha­re­point aus­ge­führt. Die Seite wurde ange­legt und der Inhalt wurde auch gesetzt. Beim nähe­ren Betrach­ten der neu Erstell­ten Seite wurde ich jedoch miss­traui­sch:

  • Aus ein­fa­chen Links wie zum Bei­spiel <a href=”../../beispiel.htm”>Beispiel</a> wurde <a>Beispiel</a>.
  • Kom­men­tare wie <!– com­ment –> wur­den ein­fach gelöscht
  • Auch Attri­bu­ten wie bei­spiels­weise Ids oder Klassen(class)  in Divs wur­den gelöscht
  • Anfüh­rungs­zei­chen wur­den ent­fernt – <div style=“test”/> wird zu <div style=test/>

Durch die­ses Ver­hal­ten wur­den die impor­tier­ten Sei­ten “wert­los” für mich. Alle dar­auf fol­gen­den Ver­su­che den Inhalt in die Seite zu schrei­ben schlug fehl. Ver­sucht habe ich fol­gende Wege:

  1. Den Inhalt zu enco­die­ren und anschlie­ßend wie­der zu deko­die­ren. Prin­zi­pi­ell hätte diese Vari­ante funk­tio­niert, jedoch hätte ich die Ren­der Metho­den des Sha­re­point Richt­Text­Edi­tors über­schrei­ben müs­sen. Das hätte wie­derum den Nach­teil das die Edi­tor Funk­tion nicht mehr ord­nungs­ge­mäß arbei­tet. Der aus­schla­ge­ge­bende Fak­tor diese Vari­ante nicht zu ver­wen­den war jedoch die feh­lende Mög­lich­keit der Inde­xie­rung des Inhal­tes, da bei die­ser Vari­ante der Inhalt in Base 64 – codier­ter Form in der Sha­re­point Daten­bank gespei­chert wor­den wäre und so durch die Suche nicht mehr inde­xiert wer­den kann.
  2. In einem zwei­ten Ver­such, lud ich mir den Stream der neu ange­leg­ten Seite (auf File – Ebene) und ersetzte den von Sha­re­point beschä­dig­ten HTML Inhalt durch den ori­gi­na­len. Lei­der wurde die­ser Inhalt beim Spei­chern der Datei erneut beschä­digt.
  3. Einen drit­ten Ver­such ersparte ich mir, da die­ser die Modi­fi­zie­rung der Sha­re­point Daten­bank vor­ge­se­hen hätte. Ich glaube der Erfolg hätte sich auch in Gren­zen gehal­ten?!

Da ich das Pro­blem gerne ohne “Dirty Hacks” lösen wollte, ent­schied ich mich eine Sup­port­an­frage bei Micro­soft zu stel­len. Dazu sei erwähnt, dass die Anfra­gen über den Micro­soft Sup­port sehr schnell und kom­pe­tent beant­wor­tet und abge­wi­ckelt wer­den.  Ich sollte meine Ant­wort von Micro­soft bekom­men; Lei­der hieß diese “By design” oder kurz auf deut­sch: abge­wie­sen.

Die Begrün­dung: Miro­soft Sha­re­point nutzt einen soge­nann­ten XSS (Cross side scrip­t­ing) Pro­tec­tion Mecha­nis­mus. Die­ser sollte ver­hin­dern das schäd­li­cher Inhalte (Code) in Sha­re­point ein­ge­pflegt wer­den kann.

Davon betrof­fen ist aller­dings auch das HTML Text­ein­gabe Con­trol. Bei­spiels­weise würde die­ser Pro­gramm – Code wie folgt abge­än­dert:

original:       Das ist ein gutes <SCRIPT>void:alert("hello world")</SCRIPT> Script verfälscht:   Das ist ein gutes Script

Auch “<” oder “>” Zei­chen wür­den wie folgt abge­än­dert: &gt – &lt. Ich emp­finde die­ses Ver­hal­ten als voll­kom­men rich­tig und auch nach­voll­zieh­bar, wenn es dabei blei­ben würde. Es stellte sich her­raus dass die­ser XSS Fil­ter auch für die Kür­zung mei­ner HTML Inhalte zustän­dig war. Micro­soft selbst kann sich nicht erklä­ren warum die­ser Fil­ter solch dras­ti­sche Ände­run­gen am HTML Quell­code vor­nimmt. Man riet mir von Sei­ten Micro­soft ernst­haft  ent­we­der ein 3rd Party AddOn als Ersatz für den Rich­T­ext­Edi­tor ein­zu­set­zen oder aber die Daten nicht inner­halb Sha­re­points zu hal­ten, son­dern extern. Kei­ner der bei­den ange­bo­te­te­nen Lösun­gen erschien mir für unser Pro­jekt auch nur ansatz­weise logi­sch bezie­hungs­weise umsetz­bar.

Lösung:

Um die Inhalte den­noch wie gefor­dert 1:1 impor­tie­ren zu kön­nen, mus­ste nun ein Work­a­round gefun­den wer­den. Dazu bot sich eine Codie­rung der beim Import bean­stan­de­ten HTML-Tags an. Nach der erfolg­rei­chen Inte­gra­tion der Metho­den in unse­ren Import kön­nen nun alle Inhalte wie gefor­dert über­nom­men wer­den.

Gerade mei­nen Bericht über den #Sha­re­point XSS Fil­ter und #HTML Enco­ding fer­tig gestellt. Unter #Communardo #Tech­blog http://bit.ly/VSTfm
This com­ment was ori­gi­nally pos­ted on Twit­ter

Genau das glei­che Pro­blem hier. Wie hast du es lösen kön­nen? Was meinst du mit “Codie­rung”? Danke und Gruss

[…] Sha­re­point und der eigen­sin­nige XSS – Fil­ter (Bericht) […]

Kommentar hinterlassen