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