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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
PHP 高手之路(二)
Oct 09 PHP
PHP连接access数据库
Mar 27 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
php堆排序(heapsort)练习
Nov 13 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php以post形式发送xml的方法
Nov 04 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 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 不使用js实现页面跳转
2014/02/11 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
理解javascript中的闭包
2017/01/11 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
vue模式history下在iis中配置流程
2019/04/17 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
python中argparse模块用法实例详解
2015/06/03 Python
python实时监控cpu小工具
2018/06/21 Python
python set内置函数的具体使用
2019/07/02 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
体育教师工作总结的自我评价
2013/10/10 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
门面房租房协议书
2014/08/20 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
2015年计划生育责任书
2015/05/08 职场文书
大学开学感言
2015/08/01 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书