首页 文章

保持用户登录的正确,安全/可靠的方法是什么? Cookies ? Session ? PHP && MYSQL

提问于
浏览
19

后来我问如何正确注销用户,现在我发现只使用cookie来保持用户登录根本不安全 .

将密码保存在cookie中并不是一种安全的方法,所以我的问题是,在我的网站上制作(登录/保持用户登录)的正确方法是什么?

目前我存储的用户ID与显示X用户配置文件的url相同,以及在MD5中加密的电子邮件和密码 .

Setcookie是我成功登录时使用的唯一功能 . 我只使用会话来存储随机数,以避免重复提交表单 . 隐藏的领域 .

•您能告诉我这是如何正确和安全的方法吗?
•你的方法是什么?

仅限PHP . 两个月的PHP,都是从你的答案中学到的 . 谢谢

5 回答

  • 4

    正如@Madara所说,没有什么是100%安全和正确的,但作为开发人员的观点,我会说保留用户会话数据的每一种方法都有其自身的优点和缺点 .

    User Data in Cookies vs Session

    如果您将用户的会话数据保存在cookie中,它将消耗较少的服务器RAM内存和处理,因为您不必将记录的用户信息保存到RAM中 . 此外,如果用户增加,则建议将用户会话数据保留在cookie而不是会话中,因为保持会话将消耗服务器资源,并且您的应用程序可能会更慢并且无响应 . 好像你在哪里保持用户登录数据到会话它比cookie更安全,但它会消耗更多的服务器资源 .

    On final note: 如果您的应用程序使用HTTPS协议,那么这两种方式在其自己的实现中也是正确的,那么安全性不应该根据应用程序's and business model'的要求进行 .

  • 1

    我会用一个会话 .

    为了帮助提高安全性,一旦验证了用户凭据,就使用session_regenerate_id - 因为会话ID是在cookie中传递的内容,如果有人在登录处理时嗅探,这很重要 .

    不要在会话中存储与访问凭证相关的任何信息 - userId通常就足够了;我个人构建了一个用户对象,我在会话中存储(这些在请求之间自动序列化/反序列化 - 但你可以独立阅读) .

    如果您希望设置一个cookie,这样用户就不必在下一次访问时登录,也可以存储userId和一个可以在数据库中检查的自动生成的令牌(或类似的) - 我也会在检查中添加额外内容 - 比如存储带有令牌的最后一个ipaddress,如果它们不匹配,则再次请求登录 .

    有很多方法可以采取 - 我不提供所有/'最好的' - 让你的代码在php社区中得到人们的审查 - 你可以通过这种方式了解更多 .

  • 8

    最佳做法是使用PHP会话 .

    通过让浏览器在该会话期间每次发出请求时返回加密安全(即,不能猜测下一个有效值)字符串(称为会话ID)来维护PHP会话 . 最好和最安全的方法是为浏览器提供一个会话cookie,然后它将随每个请求一起发送 .

    使用会话cookie的另一种方法是将PHP会话ID作为GET变量包含在请求URL本身中 . 示例网址可能如下所示:

    https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

    这不如使用cookie那么安全,因为URL可能会意外地通过其他方式共享或被盗 .

    安全性很多,就像洋葱一样(常见的例子) . 您制作的内容越安全,安全性越高,使用起来就越不方便 . 这是一次成本效益权衡 . 所以你必须问,你的数据有多重要,你的用户的隐私和安全等等 .

    对我来说,基本级别是使用PHP会话,强制在cookie中的会话ID(阻止禁用cookie的用户),SSL加密,数据和cookie,并确保各种PHP设置影响会话的安全性设置为最佳,最安全的设置 . 您将要阅读这些页面和子页面上的所有内容:

  • 1

    如果某人拥有登录名和密码,则可以在浏览器中将其设置为cookie,这样他们每次访问时都无需重新登录您的网站 . 您几乎可以在浏览器cookie中存储任何内容 . 问题是用户可以随时阻止cookie或删除它们 . 例如,如果您的网站的购物车使用了Cookie,并且某人将其浏览器设置为阻止它们,则他们无法在您的网站上购物 .

    在cookie中存储数据时,您必须绝对确定用户不能以任何方式篡改数据 . 没有办法阻止用户改变cookie中的数据;这太荒谬了 . 因此,为了确保您的网站不接受包含更改数据的Cookie,您需要加密cookie值或使用哈希值对其进行签名,以便验证其完整性 .

  • 28

    首先,我告诉你这个 . 没有什么是100%安全的 . 没有什么是气密的,没有什么是神圣的 . 如果有足够的动力,攻击者就会破坏你可能提出的每一个服务器端防御(除非你使用HTTPS,这是一个不同的故事) .

    您可以使用cookie,但cookie是高度暴露的并且易于修改 . 永远不要在cookie中存储私人数据或访问级别 . 因为它很容易被攻击者窃取/修改 .

    会话也不是100%安全 . 服务器用于标识客户端的会话ID通过以下两种方式之一发送 . $ _GET变量(坏)或cookie(更好,但仍然非常糟糕) . 这意味着,如果您以管理员身份登录,通过不安全的WiFi,熟练的攻击者(以及熟练的我是指下载简单的HTTP嗅探器的pr0 haxx0r)可以轻松窃取您的SESSION ID . 虽然没有收到您的密码,但服务器会错误地将攻击者识别为您,并授予他您可能拥有/拥有的任何访问权限 .

    那么该怎么办?在大多数情况下,会话安全 . 建议您的用户不要在不安全的网络( Bus 车,网吧等)下登录 . 如果您希望允许用户授权持续一段时间,则需要cookie . 如果我需要,我通常使用2 cookie系统:

    userid=12345
    hash=$userid . $password . $user_specific_random_pregenerated_salt
    

    然后我有一些东西可以匹配,并且没有透露用户的详细信息 .


    但就像我说的那样,在一天结束的时候,如果你真的真的想要保护你的用户,那么在上面写下这个答案中的其他内容,就可以获得HTTPS .

相关问题