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 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
PHP开发微信支付的代码分享
May 25 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
php正则表达式学习笔记
Nov 13 PHP
浅谈PHP链表数据结构(单链表)
Jun 08 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
php中的buffer缓冲区用法分析
May 31 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
phpquery中文手册
Mar 18 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报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
jcrop基本参数一览
2013/07/16 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
js读取配置文件自写
2014/02/11 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
什么是python的id函数
2020/06/11 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
个人简历中的自我评价怎么写
2014/01/26 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
高中教师考核方案
2014/05/18 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis