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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
Jun 19 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
php实现三级级联下拉框
Apr 17 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php 前一天或后一天的日期
2008/06/28 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
Python中特殊函数集锦
2015/07/27 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
实习单位接收函模板
2014/01/10 职场文书
党组织公开承诺书
2014/03/29 职场文书
基层党员对照检查材料
2014/09/24 职场文书
个园导游词
2015/02/04 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
2015年手术室工作总结
2015/05/11 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android