- 浏览: 90355 次
- 性别:
- 来自: 深圳
文章分类
最新评论
PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本。在 Apache 模块的 PHP 脚本中,可以用 header() 函数来向客户端浏览器发送“Authentication Required”信息,使其弹出一个用户名/密码输入窗口。当用户输入用户名和密码后,包含有 URL 的 PHP 脚本将会加上 预定义变量 PHP_AUTH_USER , PHP_AUTH_PW 和 AUTH_TYPE 被再次调用,这三个变量分别被设定为用户名,密码和认证类型。预定义变量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 数组中。支持“Basic”和“Digest”(自 PHP 5.1.0 起)认证方法。请参阅 header() 函数以获取更多信息。
PHP 版本问题: Autoglobals 全局变量,包括 $_SERVER 等,自 PHP 4.1.0 起有效, $HTTP_SERVER_VARS 从 PHP 3 开始有效。
以下是在页面上强迫客户端认证的脚本范例:
例1. Basic HTTP 认证范例
<?php
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
header ( 'WWW-Authenticate: Basic realm="My Realm"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo 'Text to send if user hits Cancel button' ;
exit;
} else {
echo "<p>Hello { $_SERVER [ 'PHP_AUTH_USER' ]} .</>>" ;
echo "<p>You entered { $_SERVER [ 'PHP_AUTH_PW' ]} as your password.</p>" ;
}
?>
兼容性问题: 在编写 HTTP 标头代码时请格外小心。为了对所有的客户端保证兼容性,关键字“Basic”的第一个字母必须大写为“B”,分界字符串必须用双引号(不是单引号)引用;并且在标头行 HTTP/1.0 401 中,在 401 前必须有且仅有一个空格。
在以上例子中,仅仅只打印出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在实际运用中,可能需要对用户名和密码的合法性进行检查。或许进行数据库的查询,或许从 dbm 文件中检索。
注意有些 Internet Explorer 浏览器本身有问题。它对标头的顺序显得似乎有点吹毛求疵。目前看来在发送 HTTP/1.0 401 之前先发送 WWW-Authenticate 标头似乎可以解决此问题。
自 PHP 4.3.0 起,为了防止有人通过编写脚本来从用传统外部机制认证的页面上获取密码,当外部认证对特定页面有效,并且 安全模式被开启时,PHP_AUTH 变量将不会被设置。但无论如何, REMOTE_USER 可以被用来辨认外部认证的用户,因此可以用 $_SERVER['REMOTE_USER'] 变量。
配置说明: PHP 用是否有 AuthType 指令来判断外部认证机制是否有效。
注意,这仍然不能防止有人通过未认证的 URL 来从同一服务器上认证的 URL 上偷取密码。
Netscape Navigator 和 Internet Explorer 浏览器都会在收到 401 的服务端返回信息时清空所有的本地浏览器整个域的 Windows 认证缓存。这能够有效的注销一个用户,并迫使他们重新输入他们的用户名和密码。有些人用这种方法来使登录状态“过期”,或者作为“注销”按钮的响应行为。
例3. 强迫重新输入用户名和密码的 HTTP 认证的范例
<?php
function authenticate () {
header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo "You must enter a valid login ID and password to access this resource\n" ;
exit;
}
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||
( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
authenticate ();
}
else {
echo "p>Welcome: { $_SERVER [ 'PHP_AUTH_USER' ]} " ;
echo "Old: { $_REQUEST [ 'OldAuth' ]} " ;
echo "<form action='" . { $_SERVER [ 'PHP_SELF' ]} . "' METHOD='post'> \n " ;
echo "<input type=\"hidden\" name=\"SeenBefore\" value=\"1\" />\n" ;
echo "<input type=\"hidden\" name=\"OldAuth\" value=\"" . { $_SERVER [ 'PHP_AUTH_USER' ]} . \" /> \n " ;
echo "<input type=\"submit\" value=\"Re Authenticate\" />\n" ;
echo "</form></p>\n" ;
}
?>
该行为对于 HTTP 的 Basic 认证标准来说并不是必须的,因此不能依靠这种方法。对 Lynx 浏览器的测试表明 Lynx 在收到 401 的服务端返回信息时不会清空认证文件,因此只要对认证文件的检查要求没有变化,只要用户点击“后退”按钮,再点击“前进”按钮,其原有资源仍然能够被访问。不过,用户可以通过按“_”键来清空他们的认证信息。
同时请注意,在 PHP 4.3.3 之前,由于微软 IIS 的限制,HTTP 认证无法工作在 IIS 服务器的 CGI 模式下。为了能够使其在 PHP 4.3.3 以上版本能够工作,需要编辑 IIS 的设置“目录安全”。点击“编辑”并且只选择“匿名访问”,其它所有的复选框都应该留空。
另一个限制是在 IIS 的 ISAPI 模式下使用 PHP 4 的时候,无法使用 PHP_AUTH_* 变量,而只能使用 HTTP_AUTHORIZATION 。例如,考虑如下代码: list($user, $pw) = explode(’:', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); 。
IIS 注意事项: 要 HTTP 认证能够在 IIS 下工作,PHP 配置选项 cgi.rfc2616_headers 必须设置成 0 (默认值)。
注: 如果安全模式被激活,脚本的 UID 会被加到 WWW-Authenticate 标头的 realm 部分。
PHP 版本问题: Autoglobals 全局变量,包括 $_SERVER 等,自 PHP 4.1.0 起有效, $HTTP_SERVER_VARS 从 PHP 3 开始有效。
以下是在页面上强迫客户端认证的脚本范例:
例1. Basic HTTP 认证范例
<?php
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
header ( 'WWW-Authenticate: Basic realm="My Realm"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo 'Text to send if user hits Cancel button' ;
exit;
} else {
echo "<p>Hello { $_SERVER [ 'PHP_AUTH_USER' ]} .</>>" ;
echo "<p>You entered { $_SERVER [ 'PHP_AUTH_PW' ]} as your password.</p>" ;
}
?>
兼容性问题: 在编写 HTTP 标头代码时请格外小心。为了对所有的客户端保证兼容性,关键字“Basic”的第一个字母必须大写为“B”,分界字符串必须用双引号(不是单引号)引用;并且在标头行 HTTP/1.0 401 中,在 401 前必须有且仅有一个空格。
在以上例子中,仅仅只打印出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在实际运用中,可能需要对用户名和密码的合法性进行检查。或许进行数据库的查询,或许从 dbm 文件中检索。
注意有些 Internet Explorer 浏览器本身有问题。它对标头的顺序显得似乎有点吹毛求疵。目前看来在发送 HTTP/1.0 401 之前先发送 WWW-Authenticate 标头似乎可以解决此问题。
自 PHP 4.3.0 起,为了防止有人通过编写脚本来从用传统外部机制认证的页面上获取密码,当外部认证对特定页面有效,并且 安全模式被开启时,PHP_AUTH 变量将不会被设置。但无论如何, REMOTE_USER 可以被用来辨认外部认证的用户,因此可以用 $_SERVER['REMOTE_USER'] 变量。
配置说明: PHP 用是否有 AuthType 指令来判断外部认证机制是否有效。
注意,这仍然不能防止有人通过未认证的 URL 来从同一服务器上认证的 URL 上偷取密码。
Netscape Navigator 和 Internet Explorer 浏览器都会在收到 401 的服务端返回信息时清空所有的本地浏览器整个域的 Windows 认证缓存。这能够有效的注销一个用户,并迫使他们重新输入他们的用户名和密码。有些人用这种方法来使登录状态“过期”,或者作为“注销”按钮的响应行为。
例3. 强迫重新输入用户名和密码的 HTTP 认证的范例
<?php
function authenticate () {
header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo "You must enter a valid login ID and password to access this resource\n" ;
exit;
}
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||
( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
authenticate ();
}
else {
echo "p>Welcome: { $_SERVER [ 'PHP_AUTH_USER' ]} " ;
echo "Old: { $_REQUEST [ 'OldAuth' ]} " ;
echo "<form action='" . { $_SERVER [ 'PHP_SELF' ]} . "' METHOD='post'> \n " ;
echo "<input type=\"hidden\" name=\"SeenBefore\" value=\"1\" />\n" ;
echo "<input type=\"hidden\" name=\"OldAuth\" value=\"" . { $_SERVER [ 'PHP_AUTH_USER' ]} . \" /> \n " ;
echo "<input type=\"submit\" value=\"Re Authenticate\" />\n" ;
echo "</form></p>\n" ;
}
?>
该行为对于 HTTP 的 Basic 认证标准来说并不是必须的,因此不能依靠这种方法。对 Lynx 浏览器的测试表明 Lynx 在收到 401 的服务端返回信息时不会清空认证文件,因此只要对认证文件的检查要求没有变化,只要用户点击“后退”按钮,再点击“前进”按钮,其原有资源仍然能够被访问。不过,用户可以通过按“_”键来清空他们的认证信息。
同时请注意,在 PHP 4.3.3 之前,由于微软 IIS 的限制,HTTP 认证无法工作在 IIS 服务器的 CGI 模式下。为了能够使其在 PHP 4.3.3 以上版本能够工作,需要编辑 IIS 的设置“目录安全”。点击“编辑”并且只选择“匿名访问”,其它所有的复选框都应该留空。
另一个限制是在 IIS 的 ISAPI 模式下使用 PHP 4 的时候,无法使用 PHP_AUTH_* 变量,而只能使用 HTTP_AUTHORIZATION 。例如,考虑如下代码: list($user, $pw) = explode(’:', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); 。
IIS 注意事项: 要 HTTP 认证能够在 IIS 下工作,PHP 配置选项 cgi.rfc2616_headers 必须设置成 0 (默认值)。
注: 如果安全模式被激活,脚本的 UID 会被加到 WWW-Authenticate 标头的 realm 部分。
发表评论
-
RedHat下安装并开启PHP GD库的方法
2014-10-13 15:25 2127GD库是PHP进行图文操作时一个重要的库。红帽系统适合用编译安 ... -
PHP获得真实客户端的真实IP
2014-09-25 10:19 1800REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的 ... -
xxtea加密解密算法的PHP实现
2012-11-29 10:35 1631Class Xxtea { pu ... -
PHP:字符串变量中大括号(花括号{})的作用
2012-11-29 09:50 1613PHP 变量后面加上一个大括号{},里面填上数字,就是指 PH ... -
Linux下的 ZipArchive 配置
2012-08-22 13:25 3556今天在Linux底下上传Excel文件时,抛出“Z ... -
解决PHP不能上传、拷贝含有中文路径文件的问题
2012-08-01 16:29 4371在使用copy()、 move_uploaded_file ... -
empty(), is_null(), isset() 的真值表
2012-06-25 16:22 967比较全面,以便不时之需。 -
PHP获取当前时间的毫秒数
2012-06-25 16:04 238821 second = 1000 millisecond = 1 ... -
PHP之引用
2012-06-07 16:01 1037所谓PHP的引用,就是不同的名字访问同一个变量内容。可 ... -
解决PHP之 Allowed memory size of xxx bytes exhausted
2012-05-25 10:30 4890今天写了个死循环 ... -
CI框架与widget(页面布局)
2012-02-10 11:24 1681在WEB开发过程中,我们免不了要输出视图文件,而 ... -
解决url传输的中文字符乱码
2011-12-31 18:16 1148今天在做接口的时候,遇到在url里带参数时,当传入中文字符 ... -
关于obstart()
2011-12-13 09:54 948最近在开发一系列 ... -
PHP开发编码规范
2011-11-29 10:20 1278在PHP的编写过程中,越 ... -
sprintf用法小记
2011-11-14 11:06 1120sprintf()函数非常适合生成数据库查询,从而避免我们手工 ... -
查询mysql总结和预处理
2011-11-11 14:11 2440一、连接到mysql: $dbc = mysqli_conn ... -
Apache服务器解析shtml
2011-09-16 11:27 1196首先要配置apache服务器,让apache支持shtml的解 ... -
WindowsXP下Wamp5集成安装memcached
2011-09-16 10:01 1392随着各种公司业务的发展,memcache缓存在为各公司的数 ... -
php中header的用法【转载】
2011-07-25 15:30 898header的用法 header()函数 ... -
php调用远程url的四种方法
2011-03-31 15:57 9901、 用file_get_contents 以get方式获取内 ...
相关推荐
RestTemplate 是 Spring 提供的一个用于发送 HTTP 请求的客户端工具,它可以方便地进行 GET、POST 等...在实际开发中,确保遵循安全最佳实践,不要明文传输敏感信息,如密码,而是应该使用安全的认证机制和传输层加密。
这个过程涉及到Nginx服务器配置、用户认证机制以及与PHP-FPM(FastCGI Process Manager)的交互。 首先,Nginx是一个高性能的HTTP和反向代理服务器,广泛用于部署静态内容和作为动态内容如PHP的代理服务器。PHP-FPM...
1. **基础认证(Basic Authentication)**:这是一种简单但不安全的认证方式,通过HTTP头部传输用户名和密码的Base64编码。在PHP中,可以使用`$_SERVER['PHP_AUTH_USER']`和`$_SERVER['PHP_AUTH_PW']`来获取这些信息...
本文档概述了 HTTP 认证机制的两个主要方案:Basic 认证方案和摘要认证方案。这些方案的目的是为了提供一种安全的用户认证方法,以保护 HTTP 服务器和客户端之间的通信。 基本认证方案(Basic Authentication ...
服务器返回401响应时,通常会包含一个WWW-Authenticate头,指示客户端应该使用哪种类型的认证机制,如Basic、Digest等。 Digest认证是一种比Basic认证更安全的认证方式,因为它不直接发送明文密码。它基于哈希函数...
使用 Postman 或浏览器进行测试,未认证的请求将触发 Laravel 的认证机制,返回 401 未授权响应。正确提供用户名和密码后,请求将被允许通过。 8. **安全考虑** 尽管基本认证提供了简单的身份验证机制,但其安全...
PHP 提供了一种简单的方式来实现HTTP的基本认证(Basic Authentication),这个过程涉及到几个关键概念和技术。 ### 1. 基本认证流程 - 当客户端尝试访问受保护的资源时,服务器会返回一个HTTP 401 Unauthorized...
Yii2 Basic 是一款基于PHP构建的高性能Web应用开发框架,由Qiang Xue领导的团队开发。这个框架遵循MVC(Model-View-Controller)设计模式,提供了丰富的特性,包括数据库迁移、活动记录(Active Record)、缓存管理...
Nginx是一个高性能的HTTP和反向代理服务器,它提供了丰富的功能和强大的性能。在某些情况下,为了保护网站或特定资源的安全,...然而,对于更高级别的安全性需求,可能需要考虑使用更复杂的认证机制,如OAuth、JWT等。
认证过程可能涉及到用户名、密码、设备ID等信息,以及可能的安全机制如OAuth或Basic Auth。开发者需要根据官方文档提供的认证流程,正确地构造请求,将凭证传递给服务器,并接收返回的认证令牌或会话信息。 接口...
4. **HTTP认证**:PHP_HTTP扩展可能包含对各种HTTP认证机制的支持,如Basic Auth、Digest Auth、OAuth等,允许PHP脚本与需要身份验证的服务进行交互。 5. **URL重写和解析**:扩展可能提供URL的重写和解析功能,...
在实际应用中,我们更推荐使用更加安全的认证方式,如摘要认证(Digest Access Authentication)或者结合SSL/TLS使用的认证机制,这些方式可以提供更好的安全性保障。 基本HTTP认证适合用在一些安全性要求不是特别...
### PHP实现用户认证及管理完全源码解析 #### 一、概述 在现代Web开发中,用户认证与授权是至关重要的环节。通过合理的用户管理机制,可以有效保护系统的安全性,确保只有经过验证的用户才能访问特定资源。本文将...
在Laravel框架中,HTTP Basic Authentication(HTTP基本认证)是一种简单但有效的安全机制,用于保护应用程序的特定部分。"Laravel开发-laravel-httpauth" 主题聚焦于如何在Laravel项目中实现和利用HTTP基本认证来...
它提供了各种安全组件,例如CSRF(跨站请求伪造)防护、用户认证和授权机制。这使得开发者可以更轻松地构建安全的应用程序。 模板引擎是Yii的另一个亮点,它允许开发者使用简洁易读的语法创建动态和复杂的页面布局...
3. **HTTP认证**:支持多种认证机制,如Basic、Digest、NTLM等。例如,使用Basic认证: ```php curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "username:password"); ...
6. **安全特性**:Yii2 内置了防止SQL注入、跨站脚本攻击(XSS)等的安全机制,还提供了用户认证和授权功能,确保应用安全。 7. **模板引擎**:Yii2 的视图部分使用了强大的模板引擎,可以轻松创建复杂的HTML布局和...
1. **安全**:为了保护Web服务,可以采用HTTPS协议、身份验证机制(如Basic Auth或Token认证)、限流策略等。 2. **性能**:优化WSDL设计以减少数据传输,缓存响应,使用高效的编码和解码机制,以及考虑使用异步处理...
- 使用更安全的认证机制,如OAuth、JWT等,以提高安全性。 6. **其他相关文章**: - 关于PHP与Zend_Soap实现HTTP连接安全认证的文章 - 如何使用PHP模拟HTTP认证 - 解析HTTP获取的JSON字符串时遇到的问题及解决...