我有一个显示记录列表的页面: 的 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变量仍然指向记录列表页面!
我等待路径名反映详细信息页面网址的时间越长,我的页面对用户可见的空白,破坏和即将重新路由的时间越长,这是一种糟糕的用户体验。
如何快速高效地重新路由页面?
答案 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
谢谢大家。我将与我的团队讨论更大的安全问题。