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 date()日期时间函数详解
May 16 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
PHP删除数组中特定元素的两种方法
Feb 28 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+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
整理Python中的赋值运算符
2015/05/13 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
python实现ip地址的包含关系判断
2020/02/07 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
五种Python转义表示法
2020/11/27 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
工程地质勘察专业大学生求职信
2013/10/13 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
倡议书的格式写法
2015/04/28 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android