页面加载后多久可以读取路径名?
how soon on page load can I read the pathname?
我有一个显示记录列表的页面:
我的应用程序。com/records/
以及显示所选记录详细信息的页面:
我的应用程序。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变量仍然指向记录列表页面!
我等待路径名反映详细信息页面的时间越长 URL,用户看到我的页面空白、损坏和即将重新路由的时间就越长,这是一种糟糕的用户体验。
我怎样才能快速ui有效地重新路由页面?
根据经验,您永远不应尝试规避服务器操作(因此使用客户端代码获取 /records/{id} 的请求。恶意用户可以用他们自己的文件替换您的 javascript 文件,甚至可以跳过您的验证码。
正如 Quentin 在评论中提到的,更好、更安全的解决方案是在服务器端代码中使用 Authorise/Authentication 层,以确保允许用户请求该记录。虽然我不知道您的成员资格架构是如何工作的,所以我无法对细节发表评论。希望这能为您指明正确的方向!
我找到了简短的答案(但它没有解决更大的安全问题,也没有完全解决我的问题)。
添加“$location”依赖项,然后执行以下操作:
$location.path()
所以,这个:
console.log(":) " + $location.path());
console.log(":( " + window.location.pathname);
输出这个:
:) myapp.com/record/497/
:( myapp.com/records/
出于某种原因,它提供了正确的 URL,即使 angular 文档实际上说它是“...基于 window.location...”...
https://docs.angularjs.org/guide/$location
谢谢大家。我会和我的团队一起解决更大的安全问题。
我有一个显示记录列表的页面: 我的应用程序。com/records/ 以及显示所选记录详细信息的页面: 我的应用程序。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变量仍然指向记录列表页面!
我等待路径名反映详细信息页面的时间越长 URL,用户看到我的页面空白、损坏和即将重新路由的时间就越长,这是一种糟糕的用户体验。
我怎样才能快速ui有效地重新路由页面?
根据经验,您永远不应尝试规避服务器操作(因此使用客户端代码获取 /records/{id} 的请求。恶意用户可以用他们自己的文件替换您的 javascript 文件,甚至可以跳过您的验证码。
正如 Quentin 在评论中提到的,更好、更安全的解决方案是在服务器端代码中使用 Authorise/Authentication 层,以确保允许用户请求该记录。虽然我不知道您的成员资格架构是如何工作的,所以我无法对细节发表评论。希望这能为您指明正确的方向!
我找到了简短的答案(但它没有解决更大的安全问题,也没有完全解决我的问题)。
添加“$location”依赖项,然后执行以下操作: $location.path()
所以,这个:
console.log(":) " + $location.path());
console.log(":( " + window.location.pathname);
输出这个:
:) myapp.com/record/497/
:( myapp.com/records/
出于某种原因,它提供了正确的 URL,即使 angular 文档实际上说它是“...基于 window.location...”...
https://docs.angularjs.org/guide/$location
谢谢大家。我会和我的团队一起解决更大的安全问题。