使用XSS的JavaScript安全难题

使用XSS的JavaScript安全难题,javascript,security,xss,jsonp,Javascript,Security,Xss,Jsonp,我正在努力实现一个JavaScript web bug,它将被插入到我们客户的网页中。我们的客户想要的一个特性是,通过web bug将他们网页上的HTML片段传递给我们的服务器。我们使用的是JSONP,托管JavaScript web bug的服务器与托管We页面的服务器不同。其基本思想是: var element = document.getElementById(id); var html = element.innerHTML; //Encodes HTML into GET reques

我正在努力实现一个JavaScript web bug,它将被插入到我们客户的网页中。我们的客户想要的一个特性是,通过web bug将他们网页上的HTML片段传递给我们的服务器。我们使用的是JSONP,托管JavaScript web bug的服务器与托管We页面的服务器不同。其基本思想是:

var element = document.getElementById(id);
var html = element.innerHTML;
//Encodes HTML into GET request www.example.com/script?html=encodedhtml
var url = getSrcUrl(html); 
document.write(unescape("%3Cscript src='" + url + "' type='text/javascript'%3E%3C/script%3E"));
安全问题是,任何人都可以使用任意HTML向我们的服务器发出get请求,该HTML不是来自承载web bug的网页。有没有办法保证安全

我知道我们可以为推荐人检查HTTP头,但这很容易伪造。我看到了一些想法,服务器传递了一个必须在GET请求中返回的唯一令牌,但这似乎也是伪造的

我的直觉是,我们正在尝试做的事情不能安全地完成,但我想把它扔给社区,看看是否有什么聪明的事情可以做到。否则,我将不得不构建一个屏幕刮板,直接从我们的客户机下载页面,并为他们的页面提取相关的HTML

谢谢你的帮助

编辑

明确地说,我们客户的网页是面向公众的,没有安全性。换句话说,任何互联网用户都可以访问该页面并执行提交HTML片段的JavaScript错误

编辑2

一个可以接受的答案是“这是不可能的”!如果是这样的话,并且你给出了一个很好的解释,我会选择它作为被接受的答案

编辑3


我们正在为我们的客户建立一种谷歌分析系统。我们试图跟踪每个访问者对独特“项目”的访问,然后通过HTML片段自动收集关于该项目的信息。然后,我们将通过注入从原始项目收集的HTML片段,在其他页面上插入关于该项目的信息。我们试图做到这一切,而不要求我们的客户机在其服务器上安装任何东西,只需在他们的HTML中包含JavaScript web bug。

如果您想确保某些内容未被篡改,则无法在未加密的情况下通过客户机

安全地执行此操作的唯一方法是:

  • 正如您所建议的,从服务器端检索适当的页面

  • 在发送给客户机之前,使用他们不知道的密钥对HTML进行加密/签名,以便客户机无法修改它

假设您可以让客户端的web服务器为您安装md5,这似乎是使用md5哈希签名的好地方。本质上,客户机服务器确定它要发送给您的信息,将所有信息连接成一个字符串,用一个密钥连接,然后md5就是全部内容,并将结果与其所有其他输入一起传递

在您的服务器上,您获取除该签名之外的所有输入,将其连接在一起,将密钥连接到该签名上,然后对其进行md5。如果它与签名匹配,您就知道它是有效的输入

不幸的是,看起来您正在确定要在客户端(浏览器)发送的HTML。由于JavaScript是显而易见的,所有人都可以看到,因此不能真正使用秘密字符串


因此,除非有可能将这种处理转移到服务器端,否则我认为你运气不好。

你在用HTML做什么?HTML片段最终会被注入到其他网页中。如果我们不安全地这样做,那么XSS灾难的真正秘诀就是!在什么条件下?如果你退后一步,解释一下你想实现什么,而不仅仅是如何实现,这可能会帮助我们理解这个问题。@David,当然!看我上面的编辑,你的第二个想法很聪明。我将不得不考虑在我们的系统中如何工作……为什么人们仍然建议使用md5进行安全哈希?因为我们都已经习惯了。如果它对你来说不够安全,那么就用别的东西。这确实被广泛误解了。在这种情况下,MD5是可以接受的。因为已经证明您可以使用相同的MD5哈希故意创建两个文档,所以您不应该信任MD5哈希来验证您自己没有创建的文档(作者可能已经生成了两个版本的文件,一个是好的,另一个是坏的)。但是如果您自己创建了字符串和散列,那么这种风险基本上为零。如果你使用足够长的盐,你可以抵御彩虹攻击。如果你加上时间戳并定期更换盐,你就可以抵抗暴力攻击。