Bon*_*hon 23 php mysql cookies session
后来我问如何正确注销用户,现在我发现只使用cookie来保持用户登录根本不安全.
将密码保存在cookie中并不是一种安全的方法,所以我的问题是,在我的网站上制作(登录/保持用户登录)的正确方法是什么?
目前我存储的用户ID与url显示X用户配置文件的内容相同,以及在MD5中加密的电子邮件和密码.
Setcookie是我成功登录时使用的唯一功能.我只使用会话来存储随机数,以避免重复提交表单.隐藏的领域.
•您能告诉我这是如何正确和安全的方法吗?
•你的方法是什么?
仅限PHP.两个月的PHP,都是从你的答案中学到的.谢谢
Mad*_*iha 36
首先,我告诉你这个.没有什么是100%安全的.没有什么是气密的,没有什么是神圣的.如果足够的动机,攻击者将打破你可能提出的每个服务器端防御(除非你使用HTTPS,这是一个不同的故事).
您可以使用cookie,但cookie是高度暴露的并且易于修改.永远不要在cookie中存储私人数据或访问级别.因为它很容易被攻击者窃取/修改.
会话也不是100%安全.服务器用于标识客户端的会话ID通过以下两种方式之一发送.$ _GET变量(坏)或cookie(更好,但仍然非常糟糕).这意味着,如果您以管理员身份登录,通过不安全的WiFi,熟练的攻击者(以及熟练的我是指下载简单的HTTP嗅探器的pr0 haxx0r)可以轻松窃取您的SESSION ID.虽然没有收到您的密码,但服务器会错误地将攻击者识别为您,并授予他您可能拥有/拥有的任何访问权限.
那么该怎么办?大多数情况下,会话安全.建议您的用户不要在不安全的网络(公交车,网吧等)下登录.如果您希望允许用户授权持续一段时间,则需要cookie.如果我需要,我通常使用2 cookie系统:
userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)
Run Code Online (Sandbox Code Playgroud)
然后我有一些东西可以匹配,并且没有透露用户的详细信息.
但就像我说的那样,在一天结束的时候,如果你真的真的想要保护你的用户,在上面回答这个答案中写的所有内容,那就自己动手吧.
我会用一个会话.
为了帮助提高安全性,一旦验证了用户凭据,就使用session_regenerate_id - 因为会话ID是在cookie中传递的内容,如果有人在登录处理时嗅探,这很重要.
不要在会话中存储与访问凭证相关的任何信息 - userId通常就足够了; 我个人构建了一个用户对象,我存储在会话中(这些在请求之间自动序列化/反序列化 - 但你可以独立阅读).
如果您希望设置一个cookie,这样用户就不必在下一次访问时登录,也可以存储userId和一个可以在数据库中检查的自动生成的令牌(或类似的) - 我也会在检查中添加额外内容 - 比如存储带有令牌的最后一个ipaddress,如果它们不匹配,则再次请求登录.
有很多方法可以采取 - 我不提供所有/'最好的' - 让你的代码在php社区中被人们审查 - 你可以通过这种方式了解更多.
如果某人具有登录名和密码,则可以在其浏览器中将其设置为cookie,因此他们不必在每次访问时都重新登录到您的网站。您几乎可以在浏览器Cookie中存储任何内容。问题在于用户可以随时阻止cookie或将其删除。例如,如果您的网站的购物车使用cookie,而某个人设置了浏览器来阻止它们,则他们将无法在您的网站上购物。
当您将数据存储在Cookie中时,必须绝对确定用户不能以任何方式篡改数据。无法阻止用户更改Cookie中的数据。这很简单。因此,为了确保您的网站不接受包含更改的数据的cookie,您需要加密cookie值或使用允许您验证其完整性的哈希值对其进行签名。