Javascript 使用<;脚本src=。。。。查找站点的状态代码-安全问题?

Javascript 使用<;脚本src=。。。。查找站点的状态代码-安全问题?,javascript,security,scripting,dns,onerror,Javascript,Security,Scripting,Dns,Onerror,我们有一个iFrame指向动态URL的站点(通过用户输入)。 如果出现404/500或任何其他错误,我们希望用一个不同的用户友好的其他URL替换Iframe源。 为此,我们可以使用onerror事件来识别动态网站何时出现问题。(然后,如果出现问题,请更换iframe url) 这也适用于跨域url,但是可能存在这样的情况:动态url可能是恶意的,并且当恶意代码将在我们网站的同一框架、同一域中执行时,会出现此类安全问题 这个假设正确吗? 有什么解决办法吗? 还有其他建议吗 谢谢, Tal是的,如果

我们有一个iFrame指向动态URL的站点(通过用户输入)。 如果出现404/500或任何其他错误,我们希望用一个不同的用户友好的其他URL替换Iframe源。 为此,我们可以使用onerror事件来识别动态网站何时出现问题。(然后,如果出现问题,请更换iframe url) 这也适用于跨域url,但是可能存在这样的情况:动态url可能是恶意的,并且当恶意代码将在我们网站的同一框架、同一域中执行时,会出现此类安全问题

这个假设正确吗? 有什么解决办法吗? 还有其他建议吗

谢谢, Tal

是的,如果使用
标记嵌入远程JS文件,则会出现安全问题,因为代码将在页面上下文中执行


想到的唯一解决方法是向资源发出服务器端请求并解析响应头。但是,这可能与客户端请求的行为不同,因为调用将来自服务器,因此它将具有不同的IP、不同的cookie等。

如果用户只能指定帧的URL,然后,框架文档中的任何脚本都将在框架文档的上下文中运行,而不是在嵌入框架的父文档的上下文中运行

框架内运行的脚本是否可以访问父文档(即您的文档)的问题取决于:只有当它们相等时,两个文档才称为同一来源。只有在这种情况下,一个文档才能访问另一个文档

我们有一个iFrame指向动态URL的站点(通过用户输入)。如果出现404/500或任何其他错误,我们希望用一个不同的用户友好的其他URL替换Iframe源

所以听起来像是在做一种“网页浏览器”

为此,我们可以使用onerror事件来识别动态网站何时出现问题。(然后,如果出现问题,请更换iframe url)

是的,除了没有很多事情会发生错误事件。我想你已经从你对其他答案的评论中意识到了这一点。如果我没弄错的话,你说的是先使用一个虚拟的
脚本
元素来加载URL(作为脚本,即使它不是真正的脚本),然后使用
脚本
元素的using
onload
/
onerror
处理程序来确定URL是否有效(
onerror
不会在脚本错误时触发,只会在网络错误时触发)

这也适用于跨域url,但是可能存在这样的情况:动态url可能是恶意的,并且当恶意代码将在我们网站的同一框架、同一域中执行时,会出现此类安全问题

这个假设正确吗

您的假设是正确的。如果URL确实包含脚本,它将在用户浏览器中与您的站点位于同一域中执行

有什么解决办法吗

一个简单的解决方法可能是像jsfiddle.net那样做……在第三方内容和真实域之间有一个单独的子域充当“防火墙”

还有其他建议吗


脚本预加载黑客实际上就是这样,一种黑客行为。它盗用了脚本标签并发出了不必要的请求。我可能会考虑使用XHR来触发HEAD请求,或者进行一些服务器端代理。

感谢您的回答-对于第一个选项-问题它不适用于跨域URL。服务器端是k、 但是我们也需要客户端,因为ips、proxys等。当然,修复了,谢谢。这变得非常困难……JSONP也不是一个选项,因为它会执行恶意响应。很棘手。用户只能指定框架的URL,对吗?谢谢Gumbo-但是看看之前的评论,我们需要检查URL是否是accessible和工作良好。为此,我们认为在父框架中使用-如果出现恶意url,这将在父框架中运行。但您认为为什么需要这样做?您将如何做到?我们希望用户在使用后端url出现问题时获得更友好、可配置的消息。因此,不要浏览ser的404/500/.errors,他们可以获取其他消息/configurabe html。为此,我们首先(或同时)请求url(通过)同时有一个iframe作为url。如果出现错误,我们将捕获onerror事件并替换iframe url。但是,为什么要使用
脚本
?是否还有其他选项可以访问跨域url?您还有什么建议?感谢您的详细回复。至于XHR-您指的是ajax头请求?它只适用于相同的doma在请求中,正确吗?我假设除了代理之外没有其他解决方案。@Tal,它可以执行GET、POST和HEAD请求,但我如何才能跨域执行此操作?@Tal如果您可以与其他服务器的所有者协调,您可以使用它,或者如果您可以让用户安装浏览器扩展,您可以这样做。否则,代理就是p可能更好。