对于初学者,我目前设置的Plug.Session如下所示:
plug Plug.Session,
store: :cookie,
key: "_key",
signing_salt: "SALT_HERE"当用户注销时,他们会点击:
def logout(conn, _) do
conn
|> configure_session(drop: true)
|> redirect(to: "/login")
end所有登录/注销功能都会正常工作,并在登录表单上生成一个新的_key。我遇到的问题是,如果我在登录时复制_key的值,并在注销时通过Chrome Debugger替换浏览器中的Cookie值,我可以在不登录的情况下导航到一个直接的GET URL,然后就可以像登录一样访问所有内容。
有没有解决这个问题的好方法?我意识到,获取登录用户的_key值并在他们再次登录并生成新值之前使用它是非常困难的,但在浏览了一段时间后,我找不到任何关于这方面的信息。
发布于 2019-12-20 03:57:19
解决这个问题的方法是将会话存储从cookie移动到服务器端。使用store: :cookie时,所有会话信息都存储在用户的机器上的cookie中。它是用保存在服务器上的密钥加密的。该|> configure_session(drop: true)只清除该用户的cookie。如果您在服务器端将会话存储更改为ets或redis,则用户的cookie仅包含引用存储在服务器上的会话数据的密钥,从而使您可以完全控制使会话无效。
可以帮助您做到这一点的示例包:https://github.com/thoughtbot/redbird
https://stackoverflow.com/questions/59415929
复制相似问题