我可以在多长时间内读取路径名?

时间:2015-03-10 15:41:56

标签: javascript angular-ui-router

我有一个显示记录列表的页面: 的 myapp.com/records / 以及显示所选记录详细信息的页面: 的 myapp.com/record-details/497

(我使用ui-router和angular,所以我的路径指定为 url:' / record-details /:id /'

QA发现,从一个记录页面,他们可以破解URL以尝试点击另一条记录: myapp.com/record-details/498

我想阻止这一点。

正确记录的数据通过JavaScript从列表内部传递到详细信息页面,因此我有机会进行比较。所以我正在做的是将通过JS传递的recordId与从URL中提取的id进行比较。如果它们不匹配,则有人试图破解URL,我可以重新路由该页面。

不幸的是,当我第一次测试它时,URL是不可用的。我希望了解为什么不,以及需要多长时间。

记录详细信息页面中的代码如下所示:

function init(){
   // do some regex manipulation of pathname
   // compare url-RecordId with in-memory-RecordId
   console.log('rawurl : ' + window.location.pathname);
}
init();

输出:

rawurl:myapp.com/records /

所以:加载我的DETAILS页面时,pathname变量仍然指向记录列表页面!

我等待路径名反映详细信息页面网址的时间越长,我的页面对用户可见的空白,破坏和即将重新路由的时间越长,这是一种糟糕的用户体验。

如何快速高效地重新路由页面?

2 个答案:

答案 0 :(得分:0)

根据经验,你永远不应该试图规避服务器动作(因此使用客户端代码获取/ records / {id}的请求。恶意用户可以用自己的javascript文件替换你的javascript文件,甚至只是跳过您的验证码。

正如Quentin在评论中提到的,更好,更安全的解决方案是在服务器端代码上使用授权/身份验证层,以确保允许用户请求该记录。虽然我不知道您的会员架构是如何运作的,但我无法评论具体细节。希望这能指出你正确的方向!

答案 1 :(得分:0)

我找到了简短的答案(但它没有解决更大的安全问题,并没有完全解决我的问题)。

添加'$ location'依赖项,然后执行以下操作: $ location.path()

所以,这个:

console.log(":) " + $location.path());
console.log(":( " + window.location.pathname);

输出:

:) myapp.com/record/497/
:( myapp.com/records/

出于某种原因,它提供了正确的URL,即使角度文档实际上说它是“......基于window.location ......”。

https://docs.angularjs.org/guide/$location

谢谢大家。我将与我的团队讨论更大的安全问题。

相关问题