PHP获取windows登录用户名的方法


Posted in PHP onJune 24, 2014

前几天在问答区提了一下这个问题,所有回答问题的朋友都说不可能通过PHP实现,碰巧我的实习负责人帮我找到了一个方法,貌似是通过NTLM来实现的,我是新手,对具体原理也知之不详,只是自己测试了一下,很好用.
所以赶快拿出来与大家分享.这是一个法国人写的,所以编码中的注释都是法语,如果有朋友很想了解某行的注释含义,请回帖说明,我可以试着翻译一下.

<?php
/***********************************************************************
************************************************************************
*
* PHP NTLM GET LOGIN 
* Version 0.2.1                  
* Copyright (c) 2004 Nicolas GOLLET ( Nicolas (dot) gollet (at) secusquad (dot) com )
* Copyright (c) 2004 Flextronics Saint-Etienne
*
* This program is free software. You can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License.    
*
***********************************************************************/
session_start();
$headers = apache_request_headers(); // 获取用户头
if (@$_SERVER['HTTP_VIA'] != NULL){ // 确认是否使用了代理(proxy),因为ntlm验证不能穿过代理.
echo "Proxy bypass!";
}
elseif($headers['Authorization'] == NULL){  //si l'entete autorisation est inexistante如果许可头不存在
 header( "HTTP/1.0 401 Unauthorized" );  //envoi au client le mode d'identification
 header( "WWW-Authenticate: NTLM" );  //dans notre cas le NTLM
 exit;    //on quitte
}
if(isset($headers['Authorization']))   //dans le cas d'une authorisation (identification)
{ 
 if(substr($headers['Authorization'],0,5) == 'NTLM '){ // 确认client是否在ntlm下

  $chaine=$headers['Authorization'];   
  $chaine=substr($chaine, 5);  // 获取 base64-encoded type1 信息
  $chained64=base64_decode($chaine); // 解码 base64 到 $chained64
  
  if(ord($chained64{8}) == 1){   
  //   |_ byte signifiant l'etape du processus d'identification (etape 3) 
 
  // verification du drapeau NTLM "0xb2" ?l'offset 13 dans le message type-1-message (comp ie 5.5+) :
  if (ord($chained64[13]) != 178){
   echo "NTLM Flag error!";
   exit;
  }

  $retAuth = "NTLMSSP".chr(000).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
  $retAuth .= chr(000).chr(040).chr(000).chr(000).chr(000).chr(001).chr(130).chr(000).chr(000);
  $retAuth .= chr(000).chr(002).chr(002).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000);
  $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
  
  $retAuth64 =base64_encode($retAuth); // encode en base64
  $retAuth64 = trim($retAuth64);  // enleve les espaces de debut et de fin
  header( "HTTP/1.0 401 Unauthorized" );  // envoi le nouveau header
  header( "WWW-Authenticate: NTLM $retAuth64" ); // avec l'identification suppl?entaire
  exit;
  
  }
  
  else if(ord($chained64{8}) == 3){
  //     |_ byte signifiant l'etape du processus d'identification (etape 5)

  // on recupere le domaine
  $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain
  $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain. 
  $domain = str_replace("\0","",substr($chained64, $offset_domain, $lenght_domain)); // decoupage du du domain
  
  //le login
  $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.
  $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.
  $login = str_replace("\0","",substr($chained64, $offset_login, $lenght_login)); // decoupage du login
  
  if ( $login != NULL){
   // stockage des donn?s dans des variable de session
   $_SESSION['Login']=$login;
   header("Location: newpage.php");
   exit;
  }
  else{
   echo "NT Login empty!";
  }
   
 
  }
 }
}
?>
PHP 相关文章推荐
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
php数组去重实例及分析
Nov 26 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
php数组随机排序实现方法
Jun 13 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
PHP基于swoole多进程操作示例
Aug 12 PHP
PHP二维数组分页2种实现方法解析
Jul 09 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 #PHP
PHP判断表单复选框选中状态完整例子
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 #PHP
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php获取YouTube视频信息的方法
2015/02/11 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
总结对比php中的多种序列化
2016/08/28 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
MYSQL基础面试题
2012/05/13 面试题
三下乡活动方案
2014/01/31 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
给校长的建议书100字
2014/05/16 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
酒店前台辞职书
2015/02/26 职场文书
周一给客户的问候语
2015/11/10 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书