Voor een IPB 3.0.x forum ben ik bezig LaTeX te implementeren. Onderdeel daarvan is dat men op de gecreëerde code kan klikken en er dan een js-popupje verschijnt die laat zien wat de onderliggende LaTeX code is. Bijvoorbeeld:
Tenminste, dat zou het moeten zijn. IPB 3.0 kent namelijk een public function in de BBcode parser die onlicks e.d. aanpast. Daarvan zie het relevante deel er als volgt uit:
edit: de 2e "on" in de str_ireplace is een &# 111; maar die wordt hier geparsed.
Nu heb ik drie vragen:
1. Is dit nu een fatsoenlijke manier om XSS te voorkomen?
2. Zou het heel veel risico met zich meebrengen om de onclick uit de array te halen?
3. Indien dat wel risico's met zich meebrengt, heeft iemand een ander geniaal idee?
HTML:
1
| <!--LaTeX_HtmlStart: CgomIzA5MjtpbnRfMF57JiMwOTI7aW5mdHl9JiMwOTI7ZnJhY3t4XjN9e2VeeC0xfSBkeAoK :LaTeX_HtmlStart--><a style="cursor:pointer;" onclick="LatexPopup('<br>\\int_0^{\\infty}\\frac{x^3}{e^x-1} dx<br>',0)"><img src='/pad/naar/pictures/ce55f5480751b1e657f54ddb078dbf1b.gif' title='LaTeX' alt='LaTeX' border=0 align='absmiddle'></a><!--LaTeX_HtmlEnd--> |
Tenminste, dat zou het moeten zijn. IPB 3.0 kent namelijk een public function in de BBcode parser die onlicks e.d. aanpast. Daarvan zie het relevante deel er als volgt uit:
PHP:
Ofwel: mijn onclick wordt onklaar gemaakt.Daarnaast kent de functie nog wat replaces waarin dingen als "javascript", "window", "<script>" e.d. worden hernoemd.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $event_handlers = array( 'mouseover', 'mouseout', 'mouseup', 'mousemove', 'mousedown', 'mouseenter', 'mouseleave', 'mousewheel', 'contextmenu', 'click', 'dblclick', 'load', 'unload', 'submit', 'blur', 'focus', 'resize', 'scroll', 'change', 'reset', 'select', 'selectionchange', 'selectstart', 'start', 'stop', 'keydown', 'keyup', 'keypress', 'abort', 'error', 'dragdrop', 'move', 'moveend', 'movestart', 'activate', 'afterprint', 'afterupdate', 'beforeactivate', 'beforecopy', 'beforecut', 'beforedeactivate', 'beforeeditfocus', 'beforepaste', 'beforeprint', 'beforeunload', 'begin', 'bounce', 'cellchange', 'controlselect', 'copy', 'cut', 'paste', 'dataavailable', 'datasetchanged', 'datasetcomplete', 'deactivate', 'drag', 'dragend', 'dragleave', 'dragenter', 'dragover', 'drop', 'end', 'errorupdate', 'filterchange', 'finish', 'focusin', 'focusout', 'help', 'layoutcomplete', 'losecapture', 'mediacomplete', 'mediaerror', 'outofsync', 'pause', 'propertychange', 'progress', 'readystatechange', 'repeat', 'resizeend', 'resizestart', 'resume', 'reverse', 'rowsenter', 'rowexit', 'rowdelete', 'rowinserted', 'seek', 'syncrestored', 'timeerror', 'trackchange', 'urlflip', ); foreach( $event_handlers as $handler ) { $txt = str_ireplace( 'on' . $handler, 'on' . $handler, $txt ); } |
edit: de 2e "on" in de str_ireplace is een &# 111; maar die wordt hier geparsed.
Nu heb ik drie vragen:
1. Is dit nu een fatsoenlijke manier om XSS te voorkomen?
2. Zou het heel veel risico met zich meebrengen om de onclick uit de array te halen?
3. Indien dat wel risico's met zich meebrengt, heeft iemand een ander geniaal idee?
Tjolk is lekker. overal en altijd.