客户端可以修改反应组件状态吗?

时间:2018-02-21 17:35:49

标签: reactjs

我正在构建一个应用程序的管理页面,并且具有状态值'已验证的'从“假”中翻过来真的'成功登录后(在服务器上进行了身份验证),然后显示实际的管理面板。

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

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

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

2 个答案:

答案 0 :(得分:3)

始终可以篡改前端的值,您无法单独依靠前端来确保安全性。

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

也许如果您可以发送有关您的问题的更多信息,我们可以考虑更具体的解决方案。

答案 1 :(得分:2)

TL; DR:要么对每个请求都要求身份验证令牌,要么通过会话要求身份验证。

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

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

  

我们永远不会给任何想要删除所有内容的人提供管理权限......因为我们永远不会不信任某人。正确?

更糟糕的是,有人可能会找到服务器并模糊它的一些输入,并且哎呀!他们设法删除所有内容(甚至更糟糕的是,获取存储在数据库中的所有内容)。这并不难,特别是如果您用于进行身份验证的服务器与用于发出命令的服务器相同。历史证明“通过默默无闻的安全”是一个非常糟糕的范例。每个动作都应该被认证,即使行动很难找到。

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

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

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