1

我正在尝试使用 xhr 加载模板,然后将其附加到某个 div 中的页面。问题是页面加载脚本但不执行它。我得到的唯一解决方案是在页面中添加一些标志(例如:“Splitter”),在拆分器之前,我放了js代码,在拆分器之后我添加了html代码,当通过ajax获取模板时,我拆分它。这是一个例子:

我通过ajax请求的数据是:

//js code:
work_types = <?php echo $work_types; ?>; //json data

<!-- Splitter -->

html code:
<div id="work_types_container"></div>

所以回调返回“数据”,我只是像这样拆分和执行:

data = data.split("<!-- Splitter -->");
dojo.query("#some_div").append(data[1]); //html part
eval(data[0]); //js part

虽然这对我有用,但它似乎并不那么专业!道场中还有其他方法可以让它发挥作用吗?

4

1 回答 1

2

如果您使用的是 Dojo,则可能值得查看该dojox/layout/ContentPane模块(参考指南)。它与变体非常相似,dijit/layout/ContentPane但有一个特殊的扩展,它允许在该页面上执行 JavaScript(使用eval())。

因此,如果您不想自己完成所有这些工作,您可以执行以下操作:

<div data-dojo-type="dojox/layout/ContentPane" data-dojo-props="href: myXhrUrl, executeScripts: true"></div>

如果您担心它是一个DojoX模块(DojoX 将在 Dojo 2.0 中消失),该模块被标记为维护,因此它有更高的机会集成dijit到以后的版本中。


作为对您的eval()安全问题的回答(在评论中)。好吧,这当然是允许的,否则他们不会有这样一个名为eval(). 但实际上,它的安全性较低,原因是客户端实际上信任服务器并执行服务器发送给客户端的所有内容。

通常,除非服务器发送恶意内容(这可能是由于您的服务器上的问题或中间人攻击),否则不会出现问题,这些内容将被执行,从而导致 XSS 漏洞。

在理想世界中,服务器只发送数据,客户端解释这些数据并自己呈现。在这种设计中,客户端只信任来自服务器的数据,因此无法执行恶意逻辑(因此不会出现 XSS 漏洞)。

它不太可能发生,并且在许多情况下甚至不可能实现理想的世界解决方案,因为初始页面请求(加载您的网页)实际上是一个类似的场景,客户端执行服务器发送的任何内容。

Web 应用程序的安全性并不是要 100% 安全(这是不可能的),而是要尝试尽可能少地创建可供黑客使用的敞开大门。由您决定您认为什么是安全的,并验证“理想世界”解决方案在这种特定情况下是否可行(可能不是,或者与其他解决方案相比可能需要太多时间)。

于 2013-10-16T08:07:51.000 回答