2013-12-12 4 views
6

У меня есть строка, которая может содержать небезопасный HTML. Я хочу избежать тегов в строке, меняя <script> на &lt;script&gt;Как избежать строки для HTML?

Как я могу сделать это с помощью дротика?

ответ

8

Использовать HtmlEscape от dart:convert.

import 'dart:convert' show HtmlEscape; 

void main() { 
    var unsafe = 'Hello <script>world</script>'; 

    var sanitizer = const HtmlEscape(); 

    print(sanitizer.convert(unsafe)); 
} 

Вышеприведенное печатает приложение:

поведения
Hello &lt;script&gt;world&lt;&#x2F;script&gt; 

по умолчанию является бежать апостроф, больше чем/меньше чем, цитат, и косых.

Если вы хотите контролировать, что скрывается, вы можете создать новый HtmlEscape с HtmlEscapeMode.

Например, чтобы избежать только больше чем/меньше чем и косые, попробуйте следующее:

var sanitizer = const HtmlEscape(HtmlEscapeMode.ELEMENT); 

Помните, Dart автоматически дезинфицирует строки, прежде чем они попадают в HTML. Таким образом, вам может не понадобиться вручную скрывать скрипт HTML. Если вы вызываете element.setInnerHtml с небезопасной строкой, он будет подвергнут санитарной обработке.

+1

И что будет наоборот: проанализировать строку, содержащую объекты HTML, и получить чистую строку? Кажется, что это не реализовано: https://code.google.com/p/dart/source/browse/branches/1.6/dart/sdk/lib/convert/html_escape.dart –

+1

** Тот факт, что Element.setInnerHtml дезинфицирует по умолчанию, как правило, не означает, что вам не нужно выводить вывод. ** Дезинфицирующее средство (надеюсь) защитит вас от XSS _if_, вы забудете избежать выхода, но все равно будете генерировать неверный результат. Вам все равно нужно бежать за правильным поведением; дезинфицирующее средство является защитной сетью. Также стоит отметить: вы можете заменить дезинфицирующее средство валидатором, что приведет к ошибке, а не к молчанию при работе с выходом. Это может быть желательно, так как оно будет а) предупреждать вас об ошибке в вашей программе и b) не делает очевидным, что вы забыли побег. – ngroot

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