Javascript location.hostname安全吗?

时间:2011-05-07 04:48:47

标签: javascript security

假设我有一个php生成的javasrcipt文件,其中包含当前登录的用户名,身份证号码和电子邮件地址。如果只查看document.location.href,是否会阻止远程站点确定当前登录的用户?

这会安全吗?

if(window.document.location.hostname == 'domain.com')
var user = {
          name:'me',
          id:234243,
          email:'email@email.com'
};
else alert('Sorry you may not request this info cross sites.');

最初对我来说似乎很安全。

编辑:我最初认为这很明显,但我使用Cookie来确定当前登录的用户。我只是想阻止跨域访问用户信息。例如,如果if语句被删除,恶意站点A可以嵌入javascript文件并访问用户信息。通过添加if语句,用户js对象永远不会出现。不支持跨站点ajax,因此只有通过javascript插入,恶意站点才能尝试确定当前登录的用户。

编辑2:使用php检查我的http_refer是否安全?如果还为客户端启用了缓存怎么办?例如,如果用户访问我的站点A,其中下载了用户脚本,然后访问站点B恶意站点,脚本将被缓存,从而绕过服务器检查用户的http_refer的需要吗?

3 个答案:

答案 0 :(得分:2)

你基本上说“这是银行金库的钥匙,这是警卫的时间表,这是工作人员的时间表。但是,如果你不是来自Acme安全公司,假装我没有给这个你”。

“哦,当然,没问题,lemme只是假装撕碎了这张便条,然后租了一辆大卡车把你的保险库内容带走了”

答案 1 :(得分:1)

你真的不想尝试这样的事情。假设我正在运行一个邪恶的网站;我该怎么办?

<script>
RegExp.prototype.test = function() { return true; };
</script>
<script src="http://yoursite.example.com/dynamicjs.php"></script>
<script>
alert("Look at the data I stole: " + user);
</script>

答案 2 :(得分:0)

不,你所拥有的不是“安全”,因为它会向任何人请求包含该JavaScript的HTML页面显示这些详细信息。他们所要做的就是查看服务器返回的文本(包括脚本)。

它归结为:要么您已经对另一端进行了身份验证,在这种情况下您不需要在JavaScript中检查,或者您没有,在这种情况下您不需要将详细信息输出到响应 at all 。对客户端if声明没有任何意义。试试这个:http://jsbin.com/aboze5它会说你无法请求数据;然后执行查看源,并注意您可以看到数据。

相反,您需要检查请求服务器端的来源,如果请求的来源未经过身份验证,则根本不在脚本中输出这些详细信息。

更新1:下面说:

  

我特意试图确定document.location.href是否可以伪造。

是的,document.location可以通过隐藏document符号来伪造(虽然如果你足够努力就可以检测到它):

(function() {
    var document; // Shadow the symbol

    document = {
      location: {
        href: "http://example.com/foo.html"
      }
    };

    alert("document.location.href = " + document.location.href);
})();

Live copy

跨域检查必须在浏览器内部进行,JavaScript代码级别的任何内容都不能安全可靠地执行。

但那真的没关系。即使它不能被伪造,引用的示例代码也不保护数据。当客户端检查完成时,数据 已经 已发送到客户端。

更新2 :您添加了关于检查HTTP_REFERER(原文如此)标题的说明(是的,它确实拼写错误)。可悲的是,不,你不能相信。 HTTP_REFERER可以被欺骗,并且可以单独禁止它。


偏离主题:您可能已经这样做了,但是:在转移个人详细信息时,您承诺保密(我不知道您是否有,但希望如此),使用HTTPS(例如,SSL)。但重要的是要记住,虽然HTTPS确保在传输过程中无法读取数据,但它无法确保请求的来源经过身份验证。例如,您知道对话是安全的(在理性和当前实践中),但您不一定知道您在与谁交谈。有认证的地方。