【问题标题】:Can the client modify react component state?客户端可以修改 React 组件状态吗?
【发布时间】:2018-02-21 17:35:49
【问题描述】:

我正在为应用程序构建一个管理页面,并且在成功登录(在服务器上经过身份验证)后,状态值“authenticated”会从“false”变为“true”,然后显示实际的管理面板.

组件状态值是否不会被客户端篡改?基本上,如果客户可以将我的“已验证”状态值修改为“真”,他们可以跳过登录并直接进入管理面板(我显然不想要)。

我读到 React Dev Tools 允许客户端修改值,但每个人都说“在服务器上验证”,但如果用户被批准,我会在服务器上验证并相应地更新我的状态。如果让状态值管理它是不明智的,那么在成功的服务器端身份验证登录后有条件地显示管理页面的正确方法是什么?

我认为这是一个重要的问题,因为篡改 React 应用中的状态值会对应用/数据库中的数据完整性产生巨大的负面影响。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    TL;DR:每个请求都需要身份验证令牌,或者需要通过会话进行身份验证。


    永远不要信任用户。一个潜在的大问题是,如果您在不需要身份验证的情况下“隐藏”管理员页面后面的管理员操作。

    例如,假设后端服务器使用 REST API 来接受命令。在管理面板中,您可以获得管理操作的链接,例如“删除所有内容”按钮,该按钮无需任何身份验证即可向server.net:8080/api/admin/everything 发送删除请求。如果您是用户,您可能会在代码中找到它,然后从任何地方向该地址发送 DELETE 请求,而不会产生任何影响。

    我们永远不会向任何想要删除所有内容的人授予管理权限...因为我们永远不会不信任某人。对吧?

    更糟糕的是,有人可能会找到服务器并对其输入进行模糊测试,然后糟糕!他们设法删除所有内容(或者更糟糕的是,获取存储在数据库中的所有内容)。这并不难做到,特别是如果您用来进行身份验证的服务器与您用来发出命令的服务器相同。历史已经证明“通过默默无闻的安全”是一个非常糟糕的范式。每个动作都应该经过身份验证,即使看起来很难找到这些动作。

    通常,提供a JSON web token 或某种其他形式的身份验证令牌并让用户在每个请求中发送它至少是一个好的开始,尤其是如果它有到期日期。令牌将通过具有有效凭据的单独请求提供。

    在每个请求中发送一个令牌显然并不理想。还有其他几件事可以尝试。对于使用 PHP 的服务器,您可能可以信任会话(尽管很多比我了解更多的人可能会不同意)。在更现代的情况下,您可以尝试使用Web Sockets,在连接后需要令牌。然后只有在使用令牌进行身份验证后,您才允许用户提出管理请求。

    这样,即使用户知道他们可以发送以执行任何操作的确切命令,服务器也不会让他们没有当前会话或令牌。不幸的是,除非您已经在使用 Web Sockets 或依赖于会话,否则可能需要进行大量更改。不过,我认为这很关键。

    【讨论】:

    • 好吧,我想我被某个人挂断了,因为有人通过更改组件的状态以某种方式进入我的管理面板,但我想他们将无法做任何事情,只要我确保他们是在每次调用我的服务器脚本时进行验证。我正在使用 Node,所以我要么做 websockets,要么在 localStorage 中保留一个令牌。
    • 确实——即使他们设法以某种方式进入管理页面,如果您为该页面返回的信息取决于他们的身份验证令牌,那么他们不会获得任何信息,也不会做任何恶意的事情。当然,您可以在客户端使用某种身份验证并检查它们是否具有权限。在这种情况下,重要的是要记住,检查是为了用户体验,而不是为了整个应用程序的安全。 WebSockets 真的很酷,我强烈推荐它们!
    【解决方案2】:

    在前端篡改值总是有可能的,你不可能仅仅依靠前端来确保安全。

    您最好的方法是在您的后端实施某种形式的身份验证和授权。这样,即使是一些用户伪装成管理员,当你向服务器发出下一个请求时,他们也会被阻止。

    也许如果您能发送更多关于您的问题的信息,我们可以想出更具体的解决方案。

    【讨论】:

    • 我选择了另一个答案,因为它更彻底,并详细说明了如何在 React 应用程序中处理身份验证。感谢您的回复。
    • 当然!感谢您的反馈!!我希望你能在你的项目中走得更远! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2023-04-08
    • 2011-02-24
    相关资源
    最近更新 更多