欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP如何实现HTTP验证

程序员文章站 2022-09-10 12:47:03
在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录。但其实 http 也提供了这种登录验证机制,我们今天就来学习关于 htt...

在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录。但其实 http 也提供了这种登录验证机制,我们今天就来学习关于 http 验证相关的知识。

http basic

还是直接就从代码入手,上面的代码就是最简单的一种 http 认证方式,如果 $_server['php_auth_user'] 不存在,那么我们就向浏览器发送一个 401 响应头,就是告诉浏览器我们需要登录验证。当浏览器收到这个响应头时,就会弹出一个浏览器自带的验证框并要求输入用户名和密码。

当我们填写了用户名和密码后,浏览器会在请求头中带上 authorization 字段,并且将 base64 之后的用户名和密码发送过来。同时,php将会分别把用户名和密码解析到_server['php_auth_user']和_server['php_auth_pw'] 中。

上述这种认证方式就是最简单的 http basic 认证,可以看出,这种方式进行验证的用户名和密码其实是相当于明文传输的,因为 base64 很容易就可以反向解析出来。所以这种方式是非常不安全的。那么有没有更复杂一些的方式呢?

http digest

既然这么写了,那肯定是有更好的方式啦,那就是 http digest 方式的 http 认证。

从代码量就可以看出这种方式复杂了很多。首先是我们一样需要在未登录的情况下返回 401 响应头,告诉浏览器我们要进行 digest 认证。这里 header 信息就有不一样的地方了,格式是 digest ,内容也比 basic 多了许多,这些多出来的内容都是我们在验证认证内容的时候需要用到的。

接着,浏览器一样是会弹出输入用户名和密码的弹窗。然后将加密后的用户名和密码信息提交上来。我们可以看到返回值里有明文的 username ,但是没有明文的密码了。其实密码是通过 username 、 密码 、 nonce 、 nc 、 cnoce 、cop 、$_server['request_method'] 、 uri 等这些内容进行 md5 加密后生成的,放在了 response 字段中提交了上来。我们也需要按照同样的规则获得加密后的密码进行比对就可以判定用户名和密码正确从而让用户完成正常的登录流程。

在这段代码中,我们加入了一个 cookie ,是为了做退出登录的判断使用的。因为 http 认证这种形式的过期时间是以浏览器为基准的。也就是如果客户端关闭了浏览器,则客户端浏览器内存中保存的用户名和密码才会消失。这种情况下我们只能通过 cookie 来进行退出登录的操作,如果用户退出登录了就改变这个 cookie 的内容并重新发送 401 响应头给浏览要求重新登录。

总结

http 验证的这种操作一般不会做为我们日常开发中的正常登录功能,大部分情况下,我们会给后台或者一些特殊的管理工具加上一层这种 http 认证来实现双重的认证,也就是为了保障后台的数据安全。比如,我会在我的 phpmyadmin 上增加一层这个认证。另外,http 认证也可以直接在 nginx 或 apache 中直接配置,不需要走到 php 这一层来,这个我们将来学习 nginx 的时候会再做说明。

测试代码: github.com/zhangyue050…

以上就是php如何实现http验证的详细内容,更多关于php http验证的资料请关注其它相关文章!

相关标签: PHP HTTP 验证