假设我有一个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的需要吗?
答案 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);
})();
跨域检查必须在浏览器内部进行,JavaScript代码级别的任何内容都不能安全可靠地执行。
但那真的没关系。即使它不能被伪造,引用的示例代码也不保护数据。当客户端检查完成时,数据 已经 已发送到客户端。
更新2 :您添加了关于检查HTTP_REFERER
(原文如此)标题的说明(是的,它确实拼写错误)。可悲的是,不,你不能相信。 HTTP_REFERER
可以被欺骗,并且可以单独禁止它。
偏离主题:您可能已经这样做了,但是:在转移个人详细信息时,您承诺保密(我不知道您是否有,但希望如此),使用HTTPS(例如,SSL)。但重要的是要记住,虽然HTTPS确保在传输过程中无法读取数据,但它无法确保请求的来源经过身份验证。例如,您知道对话是安全的(在理性和当前实践中),但您不一定知道您在与谁交谈。有认证的地方。