- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望我的用户在登录我的网站时具有“保持登录状态”的功能。根据这篇文章的最佳答案的建议,"Keep Me Logged In" - the best approach ,我决定在一个 cookie 中对用户的 salt 和密码的组合进行哈希处理,并将用户的 id(一个数字)存储在另一个 cookie 中。当然,哈希值也会存储在服务器端的数据库中,以供用户再次返回时进行验证。我使用的 salt 值与我在用户首次注册时用于散列用户密码的值相同,因此它是静态的 - 它不会在 session 之间改变。我发现这种方法存在一些问题。
1) 如果它是静态的,使用注册盐是个好主意还是我应该每次为 cookie 生成不同的盐?
2) 如果有人获得cookies的访问权限,然后将它们复制到另一台计算机上,然后尝试从该计算机访问该网站,理论上,它会自动登录到该用户的帐户,这不是一个安全问题?
3) 在一些怀有恶意的用户想要访问数据库的情况下,安全网站会使用加盐和散列密码,使黑客很难访问多个帐户(如果有的话)。但是,通过简单地使用散列值和盐值并创建一个与他们在数据库中更改的值相匹配的 cookie,他们可以有效地访问他们想要的任何帐户,从而使整个密码散列过程变得毫无用处。因此,我现在使用的这种 cookie 方法正在危害我的整个数据库和我所有用户的帐户。
所以我的问题是,如何在 PHP 中存储带有敏感信息(例如用户密码的哈希值)的 cookie,而不必担心上述问题?当然,像 Gmail 和 Hotmail 这样提供“让我保持登录状态”功能的网站采用了比我现在所做的更安全的方法,那么他们会怎么做呢?
最佳答案
不要将密码存储在 cookie 中,无论是否经过哈希处理。事实上,没有理由在 cookie 中存储任何敏感内容。您需要做的就是将一个 128 位(或更大)的随机 ID 映射到数据库中的用户帐户,并将该 ID 存储在 cookie 中。没有人会通过远程暴力猜出有效 ID,尤其是在您设置了锁定的情况下。
If someone were to gain access to the cookies and they copy them to a different computer, and then try accessing the website from that computer, theoretically, it will automatically log them in to that user's account, is this not a security issue?
是的。这是该功能的缺点。但是,如果您的网站检测到新的 IP 地址(特别是来自不同国家/地区)并需要第二步(将代码发送到移动设备等),那么您需要解决这个问题以及密码被盗的一般问题。 (这当然无助于防止本地网络攻击,例如不安全的公共(public) wifi。)
一个更方便的解决方案是要求“记住我”cookie 使用 SSL。这样黑客就永远不会看到纯文本传输中的 cookie,并且可能需要进行本地攻击。 (如果是这样,记住我的 cookie 可能是用户最不关心的问题。)
they can effectively get access to any account they want, rendering the whole password-hashing process as useless.
是的,也不是。如果您使用我描述的技术(随机 ID),那么他们只能访问具有“记住我”cookie 的帐户。但话虽如此,如果他们可以访问您的数据库,他们就可以暴力破解他们想要的任何帐户。如果密码本身很弱,即使是加盐密码也很容易在本地破解。
此外,您可以将“记住我”登录视为半登录。访问购买东西,更改电子邮件地址等,仍然需要输入密码。可以在没有密码的情况下做一些无害的事情,比如在留言板上发帖。
最后,请注意 PHP session cookie 只不过是一个临时的“记住我”标记!这在很大程度上适用于 session 劫持的概念。 “记住我” token 只是增加了一个更大的机会窗口。
简而言之:不要在 cookie 中存储任何敏感信息,cookie 需要 SSL,如果可能,实现多因素身份验证……尤其是对于管理员帐户。
关于php - 如何在 PHP 中安全地存储包含敏感数据的 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814350/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!