Javascript location.hostname安全吗?

Javascript location.hostname安全吗?,javascript,security,Javascript,Security,假设我有一个php生成的javasrcipt文件,其中包含当前登录的用户名、id号和电子邮件地址。简单的document.location.href查找是否会阻止远程站点确定当前登录的用户 这样安全吗 if(window.document.location.hostname == 'domain.com') var user = { name:'me', id:234243, email:'email@email.com' }; els

假设我有一个php生成的javasrcipt文件,其中包含当前登录的用户名、id号和电子邮件地址。简单的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.');
一开始我觉得很安全

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


编辑2:使用php检查我的http\u引用是否安全?如果还为客户端启用了缓存,该怎么办?例如,如果用户访问下载了用户脚本的my site A,然后又访问了site B恶意站点,那么脚本是否会被缓存,从而绕过服务器检查用户http_引用的需要?

否,您所拥有的不是“安全的”在这种情况下,它将向任何请求包含该JavaScript的HTML页面的人透露这些细节。他们所要做的就是查看服务器返回的文本(包括脚本)

归根结底是这样的:要么您对另一端进行了满意的身份验证,在这种情况下您不需要在JavaScript中进行检查,要么您没有,在这种情况下您根本不想将细节输出到响应。客户端
if
语句没有任何意义。试试这个:它会说你不能请求数据;然后查看源代码,注意可以看到数据

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

更新1:您在下面说:


我特别想确定document.location.href是否可以伪造

是的,
document.location
可以通过隐藏
document
符号来伪造(尽管如果您足够努力,可能可以检测到):

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

但这真的不重要。即使不能伪造,引用的示例代码也不能保护数据。当客户端检查完成时,数据已发送到客户端

更新2:您添加了一个关于检查
HTTP\u REFERER
(sic)头的注释(是的,它确实拼写错误)。不幸的是,不,你不能相信这一点<代码>HTTP_REFERER可以被欺骗,也可以单独抑制


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

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


“哦,当然,没问题,让我假装撕碎这张纸条,然后去租一辆大卡车,用“

把你的保险库里的东西运走。你真的不想尝试这样的东西。”。假设我在经营一个邪恶的网站;我该怎么办

<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>

RegExp.prototype.test=函数(){return true;};
警报(“查看我窃取的数据:“+用户”);

为什么需要将用户信息放入javascript?php是服务器端的,并且已经得到了保护。无论如何,你可能想使用https:)我正在设置一个实时ajax应用程序,它是为了方便。然后你只需要在ajax加载页面上再次生成、重新获取用户信息。现在我知道您将使用ajax来传递用户变量,这是不安全的。不清楚您要防止什么样的攻击。如果这是CSRF,那么答案是:不。@Rock,那么您建议如何修复它?但您是否需要访问客户端计算机,从而提供多余的潜在安全威胁?我认为javascript阻止了跨站点ajax。@莱姆:如果有人直接请求那个URL呢?从浏览器还是爬虫/蜘蛛?或者通过
curl
,或者
wget
?您的代码实际上只是根据位置从对象文本初始化用户对象。但是不管你是否用它来初始化
用户
,任何人都可以看到对象文本。它使用cookies来验证用户是否登录。如果有人用
wget
请求脚本,我会用空白页面或空
user
js对象进行响应。具体来说,我使用的是Kohana。我只是想阻止对当前登录用户信息的跨域访问。@莱姆:归根结底是这样的:要么你已经对另一端进行了满意的身份验证,在这种情况下你不需要在JavaScript中进行检查,要么你根本不想将详细信息输出到响应中。客户端
if
语句毫无意义。试试这个:它会说你不能请求数据;然后做一个查看源代码。我是
<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>