我有在数据库中存储 html 和 Js 的 ASP.NET MVC 应用程序。应用程序需要呈现存储的 HTML 并在该 HTML 上执行存储的 JS。基本上它应该像 JSFiddle 一样工作。
但这样的东西是开放的 XSS 攻击。所以为了最小化爆炸半径,我找到的解决方案是使用
iframe
和 sandbox
属性。我能够让它工作。下面是我的示例主 html 页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script src="~/lib/jquery/dist/jquery.min.js"></script>
</head>
<body>
<div id='myOuterDiv'></div>
<iframe src="/home/html" sandbox="allow-scripts">
</iframe>
</body>
</html>
[HttpGet]
public IActionResult Html()
{
var storedHtml = "<div id='myInnerDiv'></div>";
var storedJsScript = "<script>$(function(){$('#myInnerDiv').html('foo bar');})</script>";
var jq = "<script src='/lib/jquery/dist/jquery.min.js'></script>";
var content = jq+ storedHtml + storedJsScript;
return Content(content, "text/html");
}
问题
1> 主页有一个使用jQuery的JS脚本。所以我必须在主页的标题中包含 jQuery。存储的脚本也使用 jQuery。但是,由于存储的脚本在 iframe 内执行,因此它不能从主页使用 jQuery。所以在 Html() 方法中,我再次将 jQuery 包含在存储的 HTML 中。这里还有其他解决方案而不是下载 jQuery 两次吗?
2> 在 iframe 内部运行的脚本是否可以访问 iframe 外部的其他 DOM 元素,如本例中的
myOuterDiv
? (我不希望存储的脚本访问其他元素所以只是确认)