代码之家  ›  专栏  ›  技术社区  ›  gerdemb

JavaScript与XSS安全之谜

  •  1
  • gerdemb  · 技术社区  · 14 年前

    我正在努力实现一个JavaScript web bug,它将被插入到我们客户的web页面中。我们的客户想要的一个特性是,通过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请求中返回的唯一令牌,但似乎这也可能是伪造的。

    我的预感是,我们正在努力做的事情不能安全地完成,但我想把这个扔给社区,看看是否有什么聪明的事情可以做。否则,我将不得不构建一个scraper,直接从我们的客户机下载页面,并为他们的页面提取相关的HTML。

    编辑

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

    编辑2

    编辑3

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   Borealid    14 年前

    如果你想确保某些东西没有被篡改,它不能通过客户端进行未加密。

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

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

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

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