在远程加载的javascript中使用document.write写出内容 - 为什么一个坏主意?

tim*_*one 5 javascript security

我不是全职的Javascript开发人员.我们有一个Web应用程序,其中一个是将一个小的信息小部件写到另一个域.字面上只是一个html表,其中写有一些值.在过去的8年里,我不得不这样做了几次,而且我总是通过一个脚本来完成它,这个脚本只是document.write的表格.

例如:

document.write('<table border="1"><tr><td>here is some content</td></tr></table>');
Run Code Online (Sandbox Code Playgroud)

在他们的域名网站上

<body>
....
<script src='http://ourdomain.com/arc/v1/api/inventory/1' type='text/javascript'></script>
.....
</body>
Run Code Online (Sandbox Code Playgroud)

我一直认为这有点难看,但它工作正常,我们总是可以控制内容(或者受信任的代表有控制权,比如你当前的库存或其他东西).所以这样的另一个项目出现了,我使用document.write在5分钟内编写了它.有人认为这太丑了,但我不知道问题是什么.在小部件方面,我也做了iframe和jsonp实现,但是iframe往往不能很好地与其他网站的css和jsonp很好地发挥作用.我缺少一些安全元素吗?或者我正在做什么?反对使用这种技术最强烈的论点是什么?有没有最好的做法我没有得到?

jos*_*736 4

说实话,我真没看出什么问题。是的,document.write非常老派,但它很简单并且得到普遍支持;您可以放心,它在每个浏览器中都可以正常工作。

对于您的应用程序(编写带有一些数据的 HTML 表),如果您愿意承担一些小风险,我认为不需要更复杂的解决方案。如果您不使用 jQuery(等),那么处理跨浏览器正常工作的 DOM 突变并不是一件容易的事情。

风险document.write:

  • 您的脚本必须同步加载。这意味着一个普通的内联脚本标记(就像您已经在使用的一样)。但是,如果有人聪明地向您的脚本标记添加async或defer属性(或者做了一些奇特的事情,例如将动态创建的script元素附加到head),您的脚本将异步加载。

    这意味着当您的脚本最终加载并调用 时write,主文档可能已经完成加载并且文档已“关闭”。调用write关闭的文档会隐式调用open,这会完全清除DOM – 本质上与清除页面并从头开始相同。你不想要这样。

  • 因为您的脚本是同步加载的,所以您将第三方页面置于服务器的支配之下。如果您的服务器出现故障或过载并且响应缓慢,则包含脚本标记的每个页面都无法完成加载,直到您的服务器响应或浏览器超时请求。

    将您的小部件放在他们的网站上的人不会高兴。

如果您对自己的正常运行时间充满信心,那么就没有理由改变您正在做的事情。

另一种方法是异步加载脚本并将表插入 DOM 中的正确位置。这意味着第三方必须插入脚本片段(或者<script async src="...">使用动态脚本标签插入技巧)。他们还需要为您创建一个特殊的脚本片段<div id="tablegoeshere">以将您的表放入其中。