Создание безопасных виджетов ThingWorx
При создании настраиваемых виджетов убедитесь, что создаваемые виджеты защищены. Необходимо учитывать уязвимости межсайтовых скриптов (XSS) и подделку межсайтовых запросов (CSRF). Дополнительные сведения см. в разделе Обновление метода запроса и фильтрации типа содержимого для защиты CSRF.
В следующих разделах приведены оптимальные методы по созданию безопасных виджетов.
Использование кодировки для выходных значений HTML в виджетах
Если для отображения значений в интерфейсе пользователя используются виджеты, рекомендуется использовать кодировку HTML. Пример кода:
this.updateProperty = function (updatePropertyInfo) {
if (updatePropertyInfo.TargetProperty === 'Text') {
var labelText = Encoder.htmlEncode(updatePropertyInfo.SinglePropertyValue);
thisWidget.setProperty('Text', labelText);
showLabelText(thisWidget.getProperty('Text'));
}
}
В этом примере:
Функция updatePropery() вызывается при каждом изменении связанного значения свойства виджета.
Значение из виджета кодируется в HTML с помощью библиотеки кодировщика.
После кодирования используйте методы Get и Set, чтобы получить доступ к этому новому значению.
Этот шаг гарантирует, что методы Get выполняют дополнительную обработку значений, возвращаемых в интерфейс пользователя.
Использование декодирования и jQuery для выходных значений HTML в виджетах
Если для отображения значений в интерфейсе пользователя используются виджеты и для кодировки значений используется HTML, используйте декодирование HTML для преобразования закодированных значений в исходные значения. Пример кода:
function showLabelText(labelText) {
labelText = Encoder.htmlDecode(labelText);
var spanText = thisWidget.jqElement.find('.label-text');
spanText.text(labelText);
}
В этом примере:
Функция showLabelText используется для получения элемента DOM виджета и обновления значения.
Декодируйте это значение, используя библиотеку кодировщика.
Используйте для отображения значения метод text() с jQuery в элементе DOM. Этот метод содержит встроенную функцию экранирования, помогающую защитить решение от уязвимости XSS.
Использование кодировки для выходных значений HTML в JavaServer Pages (JSP)
Если для отображения значений в интерфейсе пользователя используется JSP, рекомендуется использовать кодировку HTML. Для обработки кодировки на основе контекста можно использовать утилиты ESAPI из OWASP (Open Web Application Security Project). Пример кода:
<div class="org-info">
<h1 class="orgName">
<%=ESAPIUtilities.getEncoder().encodeForHTML(orgName)%>
</h1>
<p class="orgDescription"><%=ESAPIUtilities.getEncoder().encodeForHTML(loginPrompt)%></p>
</div>
В этом примере:
Пользователи могут создавать собственные страницы входа в систему для ThingWorx.
В следующих полях необходимо ввести данные пользователя для экрана входа в систему:
orgName
loginPrompt
Данные в этих полях не являются проверенными данными. Существует потенциальная угроза, что пользователь может ввести для этих полей вредоносные символы. Поэтому необходимо выполнить обработку этих данных с помощью утилит ESAPI для HTML кодировки.
Защищенные пользовательские интерфейсы пользователя
Можно создавать собственные пользовательские интерфейсы путем разработки расширений или иметь собственные размещенные веб-решения, поддерживающие интерфейсы ThingWorx REST API. Необходимо убедиться, что данные в этих скриптах будут "обеззаражены" и закодированы, прежде чем они будут отображены в браузере.
Необходимо обязательно ознакомиться с применяемыми платформами и использовать оптимальные методы для этой среды, чтобы защитить решение от уязвимостей XSS.
В следующем примере в решении AngularJS используется шаблон, импортированный как расширение. Для создания этого рабочего процесса можно использовать утилиты ThingWorx.
<div class="node-label-wrap" ng-class="{'graph-node-nonadmin': $parent.$parent.isNonAdminUser}">
<textarea type="text" ng-model="node.label" ng-change="$parent.$parent.setBPUpdatesMade()">
</textarea>
<div class="node-label">{{node.label}}</div>
</div>
В этом примере:
node.label - непроверенные входные данные пользователя. Это произвольная строка. Пользователи предоставляют имя метки для узла рабочего процесса.
В шаблонах решений AngularJS перенос непроверенных входных данных в нотации с двойными фигурными скобками {{}}, например {{node.label}}, приводит к выполнению интерполяции строки. Значение обрабатывается как строка и не выполняется в контексте скрипта.
Ответы HTML
PTC документирует свои ответы в формате HTML в общем классе, в котором любые выходные данные фильтруются с использованием утилит ESAPI.
public void writeTableCell(String value, String id, String sClass, String sStyle) throws Exception {
startTableCell(id, sClass, sStyle);
writeValue(value);
endTableCell();
}

public void writeValue(String value) throws Exception {
write(ESAPIUtilities.getEncoder().encodeForHTML(value));
}
Было ли это полезно?