建立安全 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 方法對傳回至使用者介面的值執行額外的處理動作。
針對小器具中的 HTML 輸出值使用解碼與 jQuery
如果您使用小器具在使用者介面中顯示值,並使用 HTML 編碼為值編碼,使用 HTML 解碼將編碼值轉換為其原始值。請參閱下列範例程式碼:
function showLabelText(labelText) {
labelText = Encoder.htmlDecode(labelText);
var spanText = thisWidget.jqElement.find('.label-text');
spanText.text(labelText);
}
在此範例中:
函數 showLabelText 用來取得小器具的 DOM 元素並更新值。
使用編碼器資料庫解碼值。
針對 DOM 元素使用 jQuerytext() 方法以顯示值。此方法具有內建的逸出函數,有助於保護解決方案,以免受到 XSS 安全漏洞的影響。
使用 JavaServer 頁面 (JSP) 中的 HTML 輸出編碼
如果您使用 JSP 來在使用者介面中顯示值,則建議使用 HTML 編碼。您可以使用 OWASP 中的 ESAPI 公用程式來在前後關聯的基礎上處理編碼。請參閱下列範例程式碼:
<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 之您自己的主控 Web 解決方案。在這些情況下,您應確保對資料進行清除與編碼,然後才能將其在瀏覽器中顯示。
請確保您瞭解要實行的架構,並使用該環境的最佳作法來保護解決方案,以免受到 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));
}
這是否有幫助?