2015-08-14 2 views
2

Я хотел бы показать текст с исполнением HTML (formated) в браузере, поэтому его будет легко читать, но без выполнения JavaScript. Это большой текст, и очень сложно читать между тегами HTML. Итак, выполните HTML, но не JavaScript.Как остановить любые последующие события JavaScript, чтобы избежать XSS

Что я сделал: я загрузил этот текст в , так что я могу иметь полный контроль, и я попытался показать текст, как это:

<script> 
throw new Error('This is just to abort javascript'); 
</script> 
<?php echo $text ?> 
<script> 
throw new Error('This is just to abort javascript'); 
</script> 

консоль не отображает ошибку, но даже в этом случае, если у меня есть $text = '<script>alert(1)</script>';, этот скрипт будет выполнен в любом случае.

Другой пример XSS, которого я бы хотел избежать. $text = '<a href="#" onmouseover="alert(1)">this is a fake url</a>';

В принципе, отмените выполнение JavaScript со страницы.

Заранее благодарен!

+0

Вы хотите полностью удалить любые скрипты JS в '$ text', или вы хотите, чтобы они отображались как текст в iframe без выполнения? – blcook223

+0

Вы не можете отключить выполнение javascript только для определенной области кода. Только для всей страницы (а также только вручную в настройках вашего браузера). Я боюсь, что вы начнете обходить сценарии фильтрации или избежать этого. – Benjamin

+0

Еще одна уязвимость xss, о которой нужно знать, которая может нарушить планы фильтрации всего, что не является «href» ... 'I'm totally legit, click me.' – samlev

ответ

1

Вы можете укажите Content Security Policy, чтобы предотвратить выполнение любого встроенного JavaScript.

See here для браузера совместимость.

Также рекомендуется запускать любой пользовательский ввод через дезинфицирующее средство HTML, так как это поможет защитить браузеры без поддержки CSP. Также рекомендуется использовать BBcode или что-то вроде MarkDown, а не позволять пользователям вводить необработанный HTML, поскольку это намного проще (а сложность - это защита от безопасности).

+0

Прохладный материал!Я не знал об этом заголовке. BBCode не вариант. Клиент должен иметь возможность скопировать-вставить некоторый HTML-код в нашу платформу, и мы должны прочитать содержимое. Есть ли обходной путь для IE? (Боже, я так ненавижу Microsoft для этого браузера!) – vectorialpx

+0

Я считаю, что частичной поддержки достаточно, чтобы предотвратить создание сценариев. Использование этого с установленным дезинфицирующим средством для HTML обычно будет адекватным (пожалуйста, не пытайтесь писать самостоятельно, _it's complex_!). – SilverlightFox

+0

IE не знает об этом заголовке. Я попробовал 'header (« Content-Security-Policy: default-src »none»); 'и' header ("X-Content-Security-Policy: default-src 'none'"); 'и' header (" X-Webkit-CSP: default-src 'none' ");' В Firefox все нормально, IE никак не реагирует. – vectorialpx

3

К сожалению, на самом деле это невозможно. Причина, по которой это не работает, заключается в том, что ошибка останавливает , что сценарий выполняется, но не останавливает выполнение всех сценариев на странице.

Если вы доверяете HTML-вводу от пользователя, у вас просто будут уязвимы XSS, если вы не попытаетесь проанализировать их ввод и не удалить все, что может привести к событию javascript. Не пытайтесь это делать, у вас много страдания, если вы это сделаете.

В конечном счете, вот почему такие вещи, как MarkDown и Textile есть.

Я думаю, ответ на «то, что вы должны делать», зависит от того, что вы ждете, чтобы пользователь на самом деле отправить вам, но в конечном счете, вы должны работать под управлением любой пользовательский ввод через htmlentities и/или strip_tags

+0

Я разместил вопрос, надеясь, что кто-то знает какую-то магию :) Спасибо также за ссылки MarkDown и Textile. – vectorialpx

Смежные вопросы