Yerel Kullanıcı Hesaplarını kullanarak Windows üzerinde PHP Form Tabanlı Kimlik Doğrulama

2 Cevap php

PHP, Apache ve Windows koşuyorum. Bir etki alanı kurulum yok, bu yüzden yerel kullanıcı (Ben SAM denir düşünüyorum) Windows yerleşik hesapları veritabanı kullanmak için sitenizin form tabanlı kimlik doğrulaması istiyorum.

Active Directory kurulumu ise, bağlanmak ve komut doğrulamak için PHP LDAP modülünü kullanabilirsiniz biliyorum, ama AD olmadan LDAP yoktur. Bağımsız makineler için eşdeğer nedir?

2 Cevap

İyi soru!

Bu bazı düşünce verdik ... ve ben iyi bir çözüm düşünemiyorum. Ne aklınıza gelebilecek hemen işe yarayabilecek bir korkunç korkunç kesmek. Hiç kimse neredeyse bir gün boyunca bu soruya bir yanıt gönderdi olduğunu gördükten sonra, ben kötü bir düşündüm, ama çalışma cevap Tamam olurdu.

Sistem çalışırken SAM dosyası sınırlar kapalı. Eğer çalışma almak mümkün olabilir ama sonunda sadece şifre sağlamalarının ile bitireceğiz ve kullanıcı zaten onlara karşı maç şifreleri sağlanan karma olurdu bazı DLL Enjeksiyon hileler vardır.

Ne gerçekten istediğiniz SAM dosyası karşı kullanıcının kimliğini doğrulamak için çalışır bir şeydir. Ben aşağıdaki gibi bir şey yaparak bunu düşünüyorum.

  1. Sunucuda bir dosya paylaşımı oluşturmak ve sadece ona erişim izni olarak giriş yapabilmek için istediğiniz hesapları, böylece bunu yapmak.
  2. Web sitesi kullanıcı sağlayan kullanıcı adı ve şifreyi kullanarak payını bağlar: PHP bir WSH komut dosyası çağırmak için sistem komutunu kullanın. çalışır, ve sonra eğer sürücüyü bağını çözmek kayıtları eğer.
  3. Nasılsa sonucu toplayın. Sonuç ya script stdout'ta php döndü, ya da umarım komut için dönüş kodu kullanarak yapılabilir.

Ben güzel değil biliyorum, ama çalışması gerekir.

Ben kirli hissediyorum: |

Edit: Dış WSH komut dosyası çağırmak için neden PHP (kadarıyla ben bildim bileli) UNC yolları kullanmasına izin olmamasıdır.

Bir PHP uzantısı bina sabit disk alanı açısından oldukça büyük bir yatırım gerektirir. Ben zaten GCC (MinGW'nin) ortamında yüklü beri, PHP komut bir süreci başlatma başarımdan almaya karar verdik. Kaynak kodu aşağıda.

// Usage: logonuser.exe /user username /password password [/domain domain]
// Exit code is 0 on logon success and 1 on failure.

#include <windows.h>

int main(int argc, char *argv[])
{
	HANDLE r = 0;

	char *user = 0;
	char *password = 0;
	char *domain = 0;

	int i;

	for(i = 1; i < argc; i++)
	{
		if(!strcmp(argv[i], "/user"))
		{
			if(i + 1 < argc)
			{
				user = argv[i + 1];
				i++;
			}
		}
		else if(!strcmp(argv[i], "/domain"))
		{
			if(i + 1 < argc)
			{
				domain = argv[i + 1];
				i++;
			}
		}
		else if(!strcmp(argv[i], "/password"))
		{
			if(i + 1 < argc)
			{
				password = argv[i + 1];
				i++;
			}
		}
	}

	if(user && password)
	{
		LogonUser(user, domain, password, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &r);
	}

	return r ? 0 : 1;
}

Next is the PHP source demonstrating its use.

$user = "";
$domain = "";

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
	if(isset($_REQUEST['user'], $_REQUEST['password'], $_REQUEST['domain']))
	{
		$failure = 1;
		$user = $_REQUEST['user'];
		$password = $_REQUEST['password'];
		$domain = $_REQUEST['domain'];

		if($user && $password)
		{
			$cmd = "logonuser.exe /user " . escapeshellarg($user) . " /password " . escapeshellarg($password);
			if($domain) $cmd .= " /domain " . escapeshellarg($domain);
			system($cmd, $failure);
		}

		if($failure)
		{
			echo("Incorrect credentials.");
		}
		else
		{
			echo("Correct credentials!");
		}
	}
}

?>
<form action="<?php echo(htmlentities($_SERVER['PHP_SELF'])); ?>" method="post">
Username: <input type="text" name="user" value="<?php echo(htmlentities($user)); ?>" /><br />
Password: <input type="password" name="password" value="" /><br />
Domain: <input type="text" name="domain" value="<?php echo(htmlentities($domain)); ?>" /><br />
<input type="submit" value="logon" />
</form>