繁体   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