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 相关文章推荐
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php简单分页类实现方法
Feb 26 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 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 字符串 小常识
2009/06/05 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
js对象基础实例分析
2015/01/13 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
详解Django中六个常用的自定义装饰器
2018/07/04 Python
python基础 range的用法解析
2019/08/23 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
交通法规咨询中心工作职责
2013/11/27 职场文书
自荐信格式范文
2015/03/04 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
公司晚会主持词
2019/04/17 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
Python+Appium自动化测试的实战
2021/06/30 Python