我正在研究使用Iron Router的Meteor应用程序。我们的应用程序中有一个登录页面。即使用户未登录,如果我以未经身份验证的用户身份在开发人员控制台上调用以下代码:
Router.routes
它给出了所有路线和相应的路径。有没有办法禁用对这些路径的访问,还是需要在服务器代码中推送这些端点?
答案 0 :(得分:1)
您在客户端上定义的所有内容在客户端上都是可见的。所有的路由定义和路由逻辑也是如此。在生产代码中,这些代码会被混淆,但仍然存在。
如果您担心客户可以阅读您的路线,那么您应该更加关注它与您有关的事实。听起来有些混乱,但要点是:您应该仔细检查通过发布发布到客户端或通过服务器上的方法进行操作/创建的每个数据。如果您的后端功能强大且尽可能地安全(永远不可能达到100%),那么您无需担心,如果客户端可以看到存在哪些路由并可以访问它们。
示例:
Bob找到了路由/admin
,并禁用了路由器的触发器以重定向他(如果他不是Admin)。
现在,鲍勃可以看到管理员可以看到的所有数据。为防止这种情况,您可以在publication
中检查Bob的角色“ admin”,如果他不是admin,则不要发布给他。
Ada还通过这种方式进入了管理控制台,并希望创建一个新用户。由于您用于创建新用户的服务器方法是ValidatedMedthod
,用于检查Ava是否具有“管理员”角色,因此由于Ava不是管理员,因此将无法创建新用户。
结论:
防止客户端访问只是UI Magic bot根本不安全。简单的调整,但是在服务器端可以帮助您更好地睡眠。
更多帮助:
入门的好方法是阅读《流星安全指南》:
https://guide.meteor.com/security.html
最后还有一个安全检查表,出于完整性和SEO的原因,我在此引用:
- 确保您的应用程序没有不安全或自动发布的软件包。
- 验证所有方法和发布参数,并包括audit-argument-checks以自动检查它。
- Deny写入用户文档的个人资料字段。
- 使用方法代替客户端的插入/更新/删除和允许/拒绝。
- 在出版物中使用特定的选择器和过滤器字段。
- 除非您真的知道自己在做什么,否则不要在Blaze中使用原始HTML包含。
- 确保您的源代码中没有秘密的API密钥和密码。
- 保护数据而不是UI的安全-从客户端路由重定向到其他位置并不能保证安全,这只是一个不错的UX功能。
- 永远不要信任从客户端传递来的用户ID。在方法和出版物中使用this.userId。
- 设置浏览器策略,但要知道并非所有浏览器都支持该策略,因此它仅向具有现代功能的用户提供额外的安全性 浏览器。
答案中提到的有用软件包: