簡體   English   中英

以這種方式將 `eval` 與 `with` 語句一起使用是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM