Javascript 这样使用'eval'和'with'语句安全吗?

Javascript 这样使用'eval'和'with'语句安全吗?,javascript,Javascript,模板实际上来自同一目录中的index.html文件。 上下文可以包含用户输入 const context = { id: 1 }; const template = '<html><body>${id}</body></html>'; with (context) { return eval(`\`${template}\``); } const context={id:1}; 常量模板=“${id}”; (上下文){ 返回eval(``${

模板实际上来自同一目录中的index.html文件。 上下文可以包含用户输入

const context = { id: 1 };
const template = '<html><body>${id}</body></html>';
with (context) {
  return eval(`\`${template}\``);
}
const context={id:1};
常量模板=“${id}”;
(上下文){
返回eval(``${template}``);
}
我知道XSS保护


我正在寻找如何打破这个解决方案的示例,用户输入有没有办法运行后端代码?

使用eval从来都不是一个好主意

如果要插入字符串,可以使用

即使这样,您也应该使用输入来避免XSS。清理字符串的一种简单方法是将输入读取为文本,文本将转义输入,然后将内容转储到模板占位符中

const context={id:1};
常量模板=`${getHTMLSafeText(context.id)}`;
函数getHTMLSafeText(内容){
设div=document.createElement('div');
div.textContent=内容;
返回div.innerHTML;

}
根据
上下文
提供值的方式,可以设置
上下文.模板
。这将更改变量标识符
template
以引用属性
context.template
,并将该属性的值传递到
eval

因此,您可以通过
上下文
属性执行服务器端代码,如

template: "${alert(1)}"
或者,如果可以为
context
属性指定函数值,则设置
context.eval
将允许立即执行该函数。(然而,这不太可能可行,因为用户输入更可能被普遍视为字符串。)


您可以通过执行
delete context.template;删除context.eval
在使用
块进入
之前。

js中没有除了eval之外解析模板文本的功能,是的,如果我打印HTML,我会使用XSS保护。我正在寻找如何打破这个解决方案的示例,用户输入有没有办法运行后端代码?“js中没有除了eval之外解析模板文本的功能”?这显然是错误的。在控制台中运行以下命令:
console.log(`date为${new date()}`)
Sure。你可以这样做(你这里所说的
evaluate
是什么意思?
eval
?)你有一个文件:index.html和另一个index.js。index.html包含一个模板文本(不带引号)index.js contanis
const template=fs.readFileSync('index.html')
尝试在不使用eval的情况下对其求值。你可以说,我可以使用一个模板库,比如handlebar或jinja2,但是我不能使用javascript作为模板语言。我也可以使用react,但它对于一个返回HTML文件的简单服务来说太胖了。可能有两件事是你永远不想使用的:with和eval:)我相信这在服务器端运行是安全的,但你可能仍然想研究一个模板模块(即nunjucks、pug),以拥有完整的模板功能,包括模板继承,包括,逻辑/循环,自动转义(XSS保护),等等,`${['1','2','3'].map(e=>`${e}``)。join('\n')}`我有循环:)@AttilaVarga当然,但可读性不强(特别是当您想要嵌套循环/逻辑时)而且你仍然缺少一些最重要的功能…如果没有模板继承,你将需要在每个模板上重复大量代码。例如,即使你只有一个模板,我强烈建议你使用一个成熟的模板引擎,而不是重新发明轮子并根据需要添加功能。Ta,这绝对是broke it:D而不使用with?(上下文由代码提供,键可以包含用户输入)@AttilaVarga假设您使用
删除了
,并编写了类似
${context.id}
等模板?我认为这是安全的(但我只能完全确定某些东西是易碎的,永远不能完全确定它是安全的!)。我尝试不使用
而使用
的向量是在
上下文中获取一个有趣的值。\uuuu proto\uuuuu
查看其属性:例如,生成
上下文。\uuu proto\uuuu=global
并找到一个具有
上下文.process
访问权限的模板。但如果只允许我存储简单的字符串值,我认为这将不允许我做任何事情用
\uuuuu proto\uuuuuu
显示令人讨厌或感兴趣的内容。