PHP开发人员需要了解有关https /安全套接字层连接的哪些知识?
关于https连接的方式和原因,我几乎一无所知。显然,当我传输密码或者尤其是信用卡信息之类的安全数据时,https是一个至关重要的工具。但是,我需要了解什么?在项目中实施开发人员时,我们看到的最常见错误是什么?有时候https只是一个坏主意吗?谢谢!
解决方案
回答
确保在HTTPS页面上时,页面上的所有元素都来自HTTPS地址。这意味着元素应具有相对路径(例如" /images/banner.jpg"),以便该协议被继承,或者我们需要在每个页面上进行检查以找到协议,并将其用于所有元素。
注意:这包括所有外部资源(例如Google Analytics(分析)javascript文件)!
我唯一能想到的缺点是,它增加了浏览器和服务器的处理时间(几乎可以忽略不计)。我建议仅加密需要的传输。
回答
我建议在任何时候将任何用户数据存储在数据库中并进行通信时,都建议使用https。即使用户数据是平凡的,也要考虑此要求,因为该用户甚至使用了许多平凡的细节来在其他网站上标识自己。考虑一下银行问所有随机安全问题(例如我们居住在哪条街上?)。这可以很容易地从地址字段中获取。在这种情况下,数据不是我们认为的密码,但也可能是密码。此外,我们永远无法预料到其他用户将使用哪些用户数据来解决安全性问题。我们还可以期望,借助普通Web用户的智慧(想想祖母),这些信息可能会构成该用户密码的一部分。
一个指针,如果我们使用https
做到这一点,以便用户输入
http://www.website-that-needs-https.com/etc/yadda.php
他们将自动重定向到
https://www.website-that-needs-https.com/etc/yadda.php
(个人宠物怒气冲冲)
但是,如果我们只是在做一个普通的html网页,那实际上是从服务器到用户的单向信息传输,请不要担心。
回答
我想说的是,使用启用了SSL的网站时最常见的错误是
- 该网站错误地将用户从页面重定向为HTTP形式的https
- 该站点在必要时不会自动切换到https
- https页面上的图像和其他资产正在通过http加载,这将触发来自浏览器的安全警报。确保所有资产都使用指定https的标准URI。
- 该安全证书仅适用于一个子域(例如www),但是站点实际上使用了多个子域。如果需要,请确保获取通配符证书。
回答
为站点提供HTTPS或者安全套接字层(SSL)证书,并且通常由证书颁发机构(CA)签名,该证书颁发机构实际上是受信任的第三方,可以验证有关我们站点的一些基本详细信息并对其进行认证以供使用在浏览器中。如果浏览器信任CA,则它将信任该CA签名的所有证书(称为信任链)。
每个HTTP(或者HTTPS)请求均由两部分组成:一个请求和一个响应。当我们通过HTTPS请求某些内容时,实际上在后台发生了一些事情:
- 客户端会创建一个新的主前机密,并使用服务器的公钥对其进行加密(因此只有服务器才能对其进行解密),然后发送给服务器
- 服务器和客户端都使用此预主密钥来生成主密钥,然后将其用于创建对称会话密钥以进行实际的数据交换
- 双方发送一条消息,说他们已完成握手
- 然后,服务器将正常处理请求,然后使用会话密钥对响应进行加密
如果连接保持打开状态,则每个连接都将使用相同的对称密钥。
如果建立了新的连接,并且双方仍然拥有主密钥,则可以在"简短握手"中生成新的会话密钥。通常,浏览器会在关闭之前存储一个主密码,而服务器会将它存储几分钟或者几个小时(取决于配置)。
有关会话长度的更多信息,请参见HTTPS对称密钥可以持续多长时间?
证书和主机名
证书被分配了一个通用名称(CN),对于HTTPS,通用名称(CN)是域名。 CN必须完全匹配,例如,具有" example.com" CN的证书将与域" www.example.com"不匹配,并且用户将在其浏览器中收到警告。
在SNI之前,不可能在一个IP上托管多个域名。由于证书是在客户端甚至发送实际的HTTP请求之前获取的,并且HTTP请求包含Host:标头行,该行告诉服务器要使用的URL,因此服务器无法知道为给定的服务使用什么证书要求。 SNI将主机名添加到TLS握手的一部分中,因此只要客户端和服务器都支持该主机名(2015年,它就被广泛支持),服务器就可以选择正确的证书。
即使没有SNI,提供多个主机名的一种方法是使用包含主题备用名称(SAN)的证书,这些证书实际上是证书有效的其他域。例如,Google使用单个证书来保护其许多站点的安全。
另一种方法是使用通配符证书。可以获取诸如" .example.com"之类的证书,在这种情况下," www.example.com"和" foo.example.com"对于该证书均有效。但是,请注意," example.com"不匹配" .example.com"," foo.bar.example.com"也不匹配。如果我们使用" www.example.com"作为证书,则应将" example.com"中的任何人重定向到" www"。地点。如果他们请求https://example.com,除非我们将其托管在单独的IP上并拥有两个证书,否则它们将收到证书错误。
当然,我们可以将通配符和SAN混合使用(只要CA允许我们这样做),就可以获得" example.com"和SAN的证书" .example.com"," example.net"和" .example.net"。
形式
严格来说,如果要提交表单,则表单页面本身是否未加密都没有关系,只要提交URL转到https:// URL。实际上,已经对用户进行了培训(至少在理论上是这样),除非他们看到小小的"锁定图标",否则不要提交页面,因此,甚至表单本身也应该通过HTTPS进行处理以实现此目的。
流量和服务器负载
HTTPS流量远大于其等效的HTTP流量(由于加密和证书开销),并且还给服务器带来更大的压力(加密和解密)。如果服务器负载很重,则最好对使用HTTPS服务哪些内容非常有选择性。
最佳实践
- 如果我们不只是对整个站点使用HTTPS,它应根据需要自动重定向到HTTPS。每当用户登录时,他们都应该使用HTTPS,并且如果我们使用会话cookie,则cookie应该设置安全标志。这可以防止会话cookie的拦截,鉴于开放(未加密)的wifi网络的普及,这一点尤其重要。
- 从HTTPS更改为HTTP时,请勿执行POST(表单提交)操作。大多数浏览器会将其标记为安全警告。
回答
这里所有的小费都很好...但是我只想添加一些内容。
我已经看过一些网站,该网站为我们提供http登录页面,并且仅在我们发布用户名/密码后将我们重定向到https。这意味着用户名在建立https连接之前以明文方式传输。
简而言之,使我们从ssl登录的页面,而不是发布到ssl页面。
回答
我一般不会深入研究SSL,gregmac在这方面做得很好,请参见下文;-)。
但是,在使用SSL / TLS时会犯一些最常见(也是最关键的)错误(并非专门针对PHP):
- 强制执行HTTPS时允许HTTP
- 通过HTTP从HTTPS页面检索某些资源(例如图片,IFRAME等)
- 无意中从HTTPS页面定向到HTTP页面-请注意,这包括"假"页面,例如" about:blank"(我已经将其用作IFRAME占位符),这将不必要地且不愉快地弹出警告。
- 已配置为支持旧的,不安全的SSL版本的Web服务器(例如,SSL v2很常见,但严重损坏)(好的,这并不是程序员的问题,但是有时没有其他人会处理它……)
- 配置为支持不安全密码套件的Web服务器(我见过NULL密码仅在使用中,它基本上提供绝对NO加密)(同上)
- 自签名证书-防止用户验证站点的身份。
- 从HTTP页面请求用户的凭据,即使提交到HTTPS页面也是如此。同样,这将阻止用户在提供服务器密码之前验证服务器的身份...即使密码是以加密方式传输的,用户也无法知道他是否在虚假站点上-甚至不会被加密。
- 非安全cookie-必须在设置了"安全"属性的情况下设置与安全相关的cookie(例如sessionId,身份验证令牌,访问令牌等)。这个很重要!如果未设置为安全,则使用安全Cookie,例如SessionId可以通过HTTP(!)进行传输-攻击者可以确保这会发生-从而允许会话劫持等。在我们使用它时(这并不直接相关),也可以在Cookie上设置HttpOnly属性(有助于缓解某些XSS)。
- 过于宽松的证书-说我们有几个子域,但并非所有子域都处于同一信任级别。例如,我们有www.yourdomain.com,dowload.yourdomain.com和publicaccess.yourdomain.com。因此,我们可能会考虑使用通配符证书...。但是,即使在其他服务器上,我们也具有secure.yourdomain.com或者finance.yourdomain.com。然后,publicaccess.yourdomain.com将能够模拟secure.yourdomain.com...。虽然在某些情况下可以这样做,但通常情况下,我们希望将特权分开...
我现在就只记得这些,以后可能会重新编辑...
至于什么时候使用SSL / TLS是一个不好的主意,如果我们拥有的公开信息不适合特定受众(单个用户或者注册成员),并且我们不特别要求他们从适当的来源(例如,股票行情代码值必须来自经过身份验证的来源...),那么就没有真正的理由产生开销(而不仅仅是性能...开发/测试/证书/等)。
但是,如果我们在自己的站点和另一个"敏感程度更高"的站点之间共享资源(例如,同一台服务器),则敏感程度更高的站点应在此处设置规则。
此外,密码(和其他凭据),信用卡信息等应始终通过SSL / TLS。
回答
我发现尝试将<link>设置为不存在的样式表也会引起安全警告。当我使用正确的路径时,将显示锁定图标。