javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

php中文网
发布: 2016-12-01 01:27:44
原创
2115人浏览过

php摘要认证(digest)firefox 中 或 ie浏览器 中都能够正常弹出认证窗口,但是在 chrome内核的浏览器(例如:360安全浏览器) 中无法弹出认证窗口(广告过滤插件等已经关掉了)。

Trae国内版
Trae国内版

国内首款AI原生IDE,专为中国开发者打造

Trae国内版 815
查看详情 Trae国内版
<code>PHP 代码:
    $realm  = 'ftl.com';
    $qop    = 'auth';
    $nonce  = md5(time());
    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);
    header('HTTP/1.1 401 Unauthorized');
    echo '你取消了验证!';
    exit;</code>
登录后复制

上面这段代码在 360安全浏览器中 显示:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

查看头部信息:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

立即学习PHP免费学习笔记(深入)”;

Request Headers 中没有 Authorization 头的相关信息。

然而在 firefox 中同一段代码的显示界面如下:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

验证成功后查看头部信息如下:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

在请求头中也有 Authorization 头。

怎样在 chrome 内核的浏览器中完成 digest 认证(PHP 官网教程的代码在也会出现这个问题)??

最后,贴出完整的测试代码:

Javscript 部分:

<code>var url = 'php/xhr.php';
var xhr = new XMLHttpRequest();
xhr.open('post' , url , true , 'test' , '123456');
xhr.setRequestHeader('Content-Type' , 'Application/x-www-form-urlencoded');
xhr.send(null);
xhr.onload = function(){
    console.log('服务端反馈会数据:' , this.response);
}</code>
登录后复制

PHP 部分:

<code>
$users = array('test' => '123456');

if (!isset($_SERVER['PHP_AUTH_DIGEST'])) {
    authenticate();
    exit;
}

$digest = explode(',' , trim_all($_SERVER['PHP_AUTH_DIGEST'] , true));

$rel = array();

array_walk($digest , function($val){
    global $rel;
    $arr = explode('=' , $val);
    $rel[$arr[0]] = $arr[1];
    unset($arr);
});

unset($digest);

// 安全部分
$secure_part = $rel['username'] . ':' . $rel['realm'] . ':' . $users[$rel['username']];

// 报文部分
$header_part = $_SERVER['REQUEST_METHOD'] . ':' . $rel['uri'];

// 摘要计算
$response = md5($secure_part) . ':' . $rel['nonce'] . ':' . $rel['nc'] . ':' . $rel['cnonce'] . ':' . $rel['qop'] . ':' . md5($header_part);
$response = md5($response);

// 验证
if ($rel['response'] === $response) {
    echo '验证成功!';
} else {
    //authenticate();
    echo '验证失败!';
}

// 认证函数
function authenticate(){
    $realm  = 'ftl.com';
    $qop    = 'auth';
    $nonce  = md5(time());

    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);
    header('HTTP/1.1 401 Unauthorized');

    echo '你取消了验证!';
    exit;
}

/*
 * 过滤
 * 基本过滤:空格 \r \n 字符串
 * 加强过滤:单引号 双引号
 */
function trim_all($str = '' , $isStripQuote = false){
    $str = preg_replace('/^( |\r|\n)+/'       ,  ''   , $str);
    $str = preg_replace('/( |\r|\n)+$/'       ,  ''   , $str);
    $str = preg_replace('/(\W)( |\r|\n)+/' ,  '$1' , $str);
    $str = preg_replace('/( |\r|\n)+(\W)/' ,  '$2' , $str);

    if ($isStripQuote) {
        $str = preg_replace('/"|\'/' , '' , $str);
    }

    return $str;
}
</code>
登录后复制

回复内容:

php摘要认证(digest)firefox 中 或 ie浏览器 中都能够正常弹出认证窗口,但是在 chrome内核的浏览器(例如:360安全浏览器) 中无法弹出认证窗口(广告过滤插件等已经关掉了)。

<code>PHP 代码:
    $realm  = 'ftl.com';
    $qop    = 'auth';
    $nonce  = md5(time());
    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);
    header('HTTP/1.1 401 Unauthorized');
    echo '你取消了验证!';
    exit;</code>
登录后复制

上面这段代码在 360安全浏览器中 显示:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

查看头部信息:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

立即学习PHP免费学习笔记(深入)”;

Request Headers 中没有 Authorization 头的相关信息。

然而在 firefox 中同一段代码的显示界面如下:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

验证成功后查看头部信息如下:

javascript - PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

在请求头中也有 Authorization 头。

怎样在 chrome 内核的浏览器中完成 digest 认证(PHP 官网教程的代码在也会出现这个问题)??

最后,贴出完整的测试代码:

Javscript 部分:

<code>var url = 'php/xhr.php';
var xhr = new XMLHttpRequest();
xhr.open('post' , url , true , 'test' , '123456');
xhr.setRequestHeader('Content-Type' , 'Application/x-www-form-urlencoded');
xhr.send(null);
xhr.onload = function(){
    console.log('服务端反馈会数据:' , this.response);
}</code>
登录后复制

PHP 部分:

<code>
$users = array('test' => '123456');

if (!isset($_SERVER['PHP_AUTH_DIGEST'])) {
    authenticate();
    exit;
}

$digest = explode(',' , trim_all($_SERVER['PHP_AUTH_DIGEST'] , true));

$rel = array();

array_walk($digest , function($val){
    global $rel;
    $arr = explode('=' , $val);
    $rel[$arr[0]] = $arr[1];
    unset($arr);
});

unset($digest);

// 安全部分
$secure_part = $rel['username'] . ':' . $rel['realm'] . ':' . $users[$rel['username']];

// 报文部分
$header_part = $_SERVER['REQUEST_METHOD'] . ':' . $rel['uri'];

// 摘要计算
$response = md5($secure_part) . ':' . $rel['nonce'] . ':' . $rel['nc'] . ':' . $rel['cnonce'] . ':' . $rel['qop'] . ':' . md5($header_part);
$response = md5($response);

// 验证
if ($rel['response'] === $response) {
    echo '验证成功!';
} else {
    //authenticate();
    echo '验证失败!';
}

// 认证函数
function authenticate(){
    $realm  = 'ftl.com';
    $qop    = 'auth';
    $nonce  = md5(time());

    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);
    header('HTTP/1.1 401 Unauthorized');

    echo '你取消了验证!';
    exit;
}

/*
 * 过滤
 * 基本过滤:空格 \r \n 字符串
 * 加强过滤:单引号 双引号
 */
function trim_all($str = '' , $isStripQuote = false){
    $str = preg_replace('/^( |\r|\n)+/'       ,  ''   , $str);
    $str = preg_replace('/( |\r|\n)+$/'       ,  ''   , $str);
    $str = preg_replace('/(\W)( |\r|\n)+/' ,  '$1' , $str);
    $str = preg_replace('/( |\r|\n)+(\W)/' ,  '$2' , $str);

    if ($isStripQuote) {
        $str = preg_replace('/"|\'/' , '' , $str);
    }

    return $str;
}
</code>
登录后复制
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号