[英]Is it safe to use `eval` with the `with` statement this way?
模板實際上來自同一目錄中的 index.html 文件。 上下文可以包含用戶輸入。
const context = { id: 1 };
const template = '<html><body>${id}</body></html>';
with (context) {
return eval(`\`${template}\``);
}
我知道 XSS 保護。
我正在尋找如何破解此解決方案的示例,用戶輸入是否可以運行后端代碼?
根據context
如何提供值,可能可以設置context.template
。 這將更改變量標識符template
以引用屬性context.template
,並將該屬性的值傳遞給eval
。
因此,您可以通過context
屬性執行服務器端代碼,例如
template: "${alert(1)}"
或者,如果可以為context
屬性指定函數值,則設置context.eval
將允許立即執行該函數。 (然而,這不太可能可行,因為用戶輸入更有可能被普遍視為字符串。)
您可以通過執行delete context.template; delete context.eval;
來避免這兩個問題delete context.template; delete context.eval;
delete context.template; delete context.eval;
在進入with
塊之前。
使用 eval 從來都不是一個好主意。
如果要插入字符串,可以使用模板文字。
即便如此,您也應該清理使用輸入以避免 XSS。 清理字符串的一種簡單方法是將輸入讀取為文本,這將轉義輸入,然后將內容轉儲到模板占位符中。
const context = { id: 1 }; const template = `<html><body>${getHTMLSafeText(context.id)}</body></html>`; function getHTMLSafeText(content) { let div = document.createElement('div'); div.textContent = content; return div.innerHTML; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.