PHP获取windows登录用户名的方法_php技巧

前几天在问答区提了一下这个问题,所有回答问题的朋友都说不可能通过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用户名
js 获取windows用户名、登录到windows用户名、windows 获取用户名、js获取当前登录用户名、获取当前登录用户名,以便于您获取更多的相关知识。

时间: 2024-08-31 01:53:55

PHP获取windows登录用户名的方法_php技巧的相关文章

php使用cookie保存登录用户名的方法_php技巧

本文实例讲述了php使用cookie保存登录用户名的方法.分享给大家供大家参考.具体如下: 提交表单页面 复制代码 代码如下: <?php $user = isset($_COOKIE['username'])?$_COOKIE['username']:''; ?> <form action="file.php" method="post"> 用户名:<input type="text" name="use

php实现登录tplink WR882N获取IP和重启的方法_php技巧

本文实例讲述了php实现登录tplink WR882N获取IP和重启的方法.分享给大家供大家参考,具体如下: 服务器一上传大数据tplink WR882N就容易卡住, 然后上不了网. 打算在服务器定时检测, 如发现连续10次无法访问指定网站, 则自动执行重启操作(该部分未实现, 请自己添加). gg了一圈发现只有旧版的tplink登录脚本, 试了很久没成功 – 家里的tplink 740N倒是没问题. 于是只能直接写了, 简单的脚本如下, 可自己扩展 该脚本只适用WR882N, 其他型号未测试.

php实现获取文件mime类型的方法_php技巧

本文实例讲述了php获取文件mime类型的方法.分享给大家供大家参考.具体如下: 1.使用 mime_content_type 方法 string mime_content_type ( string $filename ) Returns the MIME content type for a file as determined by using information from the magic.mime file.   <?php $mime_type = mime_content_t

php中使用session防止用户非法登录后台的方法_php技巧

本文实例讲述了php中使用session防止用户非法登录后台的方法.分享给大家供大家参考.具体如下: 一般来说,我们登录网站后台时,服务器会把登录信息保存到session文件里,并通过读取session文件来判断是否可以进行后台操作. 以下面为例,假如admin.php是我们的后台操作页面,如果没有启用 session,那么,即便是没有登录,用户照样能访问到该页面,这时候,就需要用到 session 来防止用户非法登录到这个页面了.下面是三个文件的代码 登录页面:login.php 复制代码 代

php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法_php技巧

本文实例讲述了php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法.分享给大家供大家参考.具体实现方法如下: <?php header("Content-Type:text/html;charset=UTF-8"); /*本程序功能:根卖家昵称获取卖家店铺sid,还有店铺标题*/ //config $appKey = '12345678; //你的密匙 $appSecret = '123456789'; $usernick = 'grayvoice'; //你的用户名

php获取flash尺寸详细数据的方法_php技巧

本文实例讲述了php获取flash尺寸详细数据的方法.分享给大家供大家参考,具体如下: 有时我们的网站需要获取flash文件的尺寸信息,php有一个内置的函数可以实现,这个函数就是getimagesize,他可以返回图像的尺寸及文件类型的一个数组. 如果你还想着通过解析swf文件头信息来获取flash文件的尺寸信息,那真的有点走远了,因为从PHP 4开始已经内置getimagesize函数来做这个事,其功能测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2

php从给定url获取文件扩展名的方法_php技巧

本文实例讲述了php从给定url获取文件扩展名的方法.分享给大家供大家参考.具体实现方法如下: <?php /** * 给定url,获取文件后缀 * @param string $url * @return string */ function getUrlPostfix ($url) { $url_arr = explode('.', $url); $postfix = $url_arr[count($url_arr) - 1]; $substr = substr($postfix, 0, 3

php简单获取文件扩展名的方法_php技巧

本文实例讲述了php简单获取文件扩展名的方法.分享给大家供大家参考.具体实现方法如下: <?php function get_file_extension($file_name) { /* may contain multiple dots */ $string_parts = explode('.', $file_name); $extension = $string_parts[count($string_parts) - 1]; $extension = strtolower($exten

PHP获取数组最大值下标的方法_php技巧

本文实例讲述了PHP获取数组最大值下标的方法.分享给大家供大家参考.具体实现方法如下: <?php $hots = array('8213'=> 0,'8212'=> 100,'8172'=> 10008); $key = array_search(max($hots),$hots); echo $key; ?> 运行结果为:8172 希望本文所述对大家的php程序设计有所帮助. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续