Как использовать «небезопасную встроенную» политику безопасности контента в Vaadin?
Я разрабатываю приложение с Vaadin и использую Content-Security-Policy в своем BootstrapListener. Когда я тестирую свое приложение с помощью OWASP ZAP, у меня возникает проблема с
script-src 'unsafe-inline'
(средний риск). Когда я удаляю «небезопасный встроенный», мое приложение не работает.
Мой код:
String csp = "";
String defaultSrc = "default-src 'none'";
String styleSrc = "style-src 'unsafe-inline' 'self'";
String fontSrc = "font-src 'self'";
String scriptSrc = "script-src 'unsafe-inline' 'unsafe-eval' 'self'";
String imgSrc = "img-src 'self'";
String connectSrc = "connect-src 'self'";
String frameAncestors = "frame-ancestors 'self'";
String formAction = "form-action 'self'";
csp = Arrays.asList(defaultSenter code hererc,styleSrc,fontSrc,scriptSrc,imgSrc,connectSrc,frameAncestors,formAction).stream().collect(Collectors.joining(";"));
1 ответ
Согласно документации Vaadin с использованием
scriptSrc = "script-src 'unsafe-inline' 'unsafe-eval' 'self'";
это известное «ограничение» или архитектурный выбор разработчиков, которые вы не можете изменить без серьезных изменений в структуре:
Настройки script-src 'unsafe-inline' 'unsafe-eval' и style-src 'unsafe-inline' необходимы во время запуска приложения Vaadin, то есть процесса начальной загрузки. Процесс начальной загрузки, который запускает приложение, загружает набор виджетов, который является клиентской частью приложения. Он состоит из предварительно скомпилированной логики JavaScript, например, для протокола связи, элемента управления DOM, кнопок, макетов и т. д., но не кода приложения. Набор виджетов является статическим ресурсом. После загрузки клиентский движок необходимо запустить с помощью JavaScript.eval().
Следовательно, эти настройки являются архитектурными ограничениями Vaadin, так что фреймворк может запускать свой клиентский движок в браузере.
Сообщается как: отсутствует или небезопасен заголовок «Content-Security-Policy».
XSS/внедрение кода с точки зрения безопасности, то, что вы можете сделать (или, возможно, уже сделали), использует встроенное экранирование для выходных данных:
Div div = new Div();
// These are safe as they treat the content as plain text
div.setText("<b>This won't be bolded</b>");
div.getElement().setText("<b>This won't be bolded either</b>");
div.setTitle("<b>This won't be bolded either</b>");
// These are NOT safe
div.getElement().setProperty("innerHTML", "<b>This IS bolded</b>");
div.add(new Html("<b>This IS bolded</b>"));
new Checkbox().setLabelAsHtml("<b>This is bolded too</b>");
и санитарная обработка:
String safeHtml = Jsoup.clean(dangerousText, Whitelist.relaxed());
new Checkbox().setLabelAsHtml(safeHtml);
Кроме того, есть причина, по которой они помечены как «небезопасные», проблема в том, что если в структуре есть недостаток или вы пропустили экранирование, CSP не может отличить введенный код от оригинала. Вы всегда должны «помечать» свои собственные безопасные скрипты, помещая их во внешние файлы или используя nonce.