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编程开发“虚拟域名”系统
Oct 09 PHP
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
php中设置多级目录session的问题
Aug 08 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
PHPstorm快捷键(分享)
Jul 17 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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
php zend解密软件绿色版测试可用
2008/04/14 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
页面使用密码保护代码
2013/04/10 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
基于Python的文件类型和字符串详解
2017/12/21 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
企业申诉管理制度
2014/01/30 职场文书
上课玩手机检讨书
2014/02/08 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
法人授权委托书
2014/04/03 职场文书
商标侵权律师函
2015/05/27 职场文书
《观潮》教学反思
2016/02/17 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏