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 相关文章推荐
php 防止单引号,双引号在接受页面转义
Jul 10 PHP
基于PHP+Ajax实现表单验证的详解
Jun 25 PHP
PHP中文编码小技巧
Dec 25 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
php检查字符串中是否包含7位GSM字符的方法
Mar 17 PHP
php数组合并与拆分实例分析
Jun 12 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 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
德生9700DX电路分析
2021/03/02 无线电
php daodb插入、更新与删除数据
2009/03/19 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python支持断点续传的多线程下载示例
2014/01/16 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
历史系毕业生自荐信
2013/10/28 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
社区好人好事材料
2014/12/26 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
如何用python插入独创性声明
2021/03/31 Python
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP