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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
php利用cookie实现访问次数统计代码
May 19 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
php递归遍历多维数组的方法
Apr 18 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
php二维码生成以及下载实现
Sep 28 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
Laravel基础_关于view共享数据的示例讲解
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
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php中socket通信机制实例详解
2015/01/03 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
Vue.js用法详解
2017/11/13 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
Zabbix实现微信报警功能
2016/10/09 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
大学生村官工作感言
2014/01/10 职场文书
教师师德反思材料
2014/02/15 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
大学生党性分析材料
2014/12/19 职场文书