【问题标题】:Secure PHP password entry possible?安全的 PHP 密码输入可能吗?
【发布时间】:2016-04-07 11:09:00
【问题描述】:

我一直在从头开始构建一个网站,虽然我有一些编码背景(尤其是 Python 和各种风格的 C),但我正在自学 html、php、sql 等等。

我非常希望能够向我的网站添加“管理视图”,以便我可以更轻松地添加和修改内容。我花了很多时间寻找一种安全的方法,隐藏在密码后面,但这似乎非常困难,甚至是不可能的。

由于我对 Internet 安全性的工作原理不完全了解,唯一的方法是让登录 php 文件包含来自 public_html 文件夹外部的 php 文件,该文件包含实际密码条目,该密码条目本身必须包含随机生成的方式修改密码输入说明,以防止任何人截获我输入的密码,以后无法使用它,然后解密输入的密码并将其发送到 public_html 文件夹之外的其他 php 文件,其中包含管理视图的基础结构.

鉴于我已经使用了几个需要输入用户名/密码的网站,这些网站使用了一种不那么复杂的方案来保护它们,我假设存在一个更好的系统。但是,任何足够坚定的攻击者都可以看到来自客户端的所有信息的主要问题似乎使这不可能。我错过了什么?

【问题讨论】:

  • 使用password_hash 创建密码的哈希值,然后将其存储在某个地方。登录时,使用password_verify 将提交的密码字符串与存储的哈希值进行比较。这样你就不会存储任何密码,你应该是“安全的”。您永远不应该在任何地方以纯文本形式存储密码,如果有人获得您的数据库的访问权限,或者由于某些错误配置/利用而可以读取密码文件怎么办?
  • 确保您的密码表单是通过 https 提交的
  • 存储不是问题,传输才是。我的印象是任何监控网站的人都可以窃取哈希值,欺骗登录页面并通过这种方式获得访问权限,如果我只是这样做的话。
  • SSL 发挥作用的地方/时间。
  • @P...:您所描述的“安全”过程实际上没有任何意义,并且对保护网站没有任何作用。您真正需要做的就是使用加密通道 (SSL),并且永远不要存储可逆密码。

标签: php security passwords


【解决方案1】:

到目前为止,您是对的,您自己的应用程序不可能保护客户端和服务器之间的密码传输。如果攻击者可以进行 ManInTheMiddle 攻击,他可以与您的客户端完全相同,或者可以在发送之前剥离试图加密或散列用户密码的 JavaScript。

因此,您唯一能做的就是使用加密的 SSL/HTTPS 连接。大多数提供商都提供安装 SSL 证书,但这通常有点贵,有时只能在专业捆绑包中使用。不过也有主机免费提供。

SSL 连接的加密有效,因为已经有一个共享密钥。浏览器会安装一个根证书列表,这些证书可用于建立加密连接。

【讨论】:

    【解决方案2】:
    1. 这是最重要的一点:使用 HTTPS。

    2. 在将密码发送到服务器之前,您应该在 javascript 中对密码使用哈希值,并且只使用哈希值。这样,实际密码就不容易获得。记得给哈希加盐。客户端散列的要点是它掩盖了原始密码。 (许多用户在多个网站上使用相同的密码。这样原始密码很难获得)

    这是一个很好的 SHA-256 实现:http://www.movable-type.co.uk/scripts/sha256.html

    1. 在存储之前在服务器端再次对其进行哈希处理,以防有人访问您的数据。别忘了盐。

    2. 请记住,安全性只是程度的问题:c)

    存储哈希的位置不太重要。只要确保它对外部不可用。 使用 .httpaccess 文件来限制访问。这里有一些例子:http://blog.dreamhosters.com/kbase/index.cgi?area=3083

    【讨论】:

    • 如何使用 HTTPS?我已经在互联网上搜索了几天,但没有找到有用的答案。我不是在自己的服务器上托管,而是使用网络托管服务(eHost,如果重要的话)并且没有直接访问服务器的权限。
    • 我注意到 javascript 中的散列/加密是最近讨论的话题。我不确定它是否真的能带来很多好处。如果您试图让拥有 Web 服务器的人获得纯文本 - 他们可以换掉 javascript。哈希服务器端也绝对应该使用password_hash,这似乎是一个安全的选择,因为他们打算随着技术的变化/改进而更新它。
    • "You should use a hash on the password in javascript, before it is send to the server" - 所以每个人都可以使用盐?客户端散列不只是将散列变成它自己的纯文本密码吗?
    • 当然,如果您只对客户端进行哈希处理,那么哈希值与您网站上的密码一样有价值 - 如果攻击者获得您的密码哈希值,他们可以直接使用它登录吗?尽管我理解散列哈希会减少可能输出的总数并增加哈希冲突的风险。我认为对于更大的位深度来说不是这样的问题。老实说,我一直认为在服务器端保护它更重要。
    • 使用 HTTPS 是服务器设置问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2014-07-24
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多