使用PHP和使用curl的LDAP进行身份验证

使用PHP和使用curl的LDAP进行身份验证,php,curl,Php,Curl,是否有一种方法可以通过LDAP对用户进行身份验证,但不使用php的LDAP模块?不幸的是,大多数共享主机似乎没有ldap模块。目前,我已经在本地主机上使用ldap模块实现了以下功能,但我希望使用cURL或file_get_contents等替代方法实现同样的功能 $ldap_connect = ldap_connect("server.ip", 389); ldap_set_option($ldap_connect, LDAP_OPT_NETWORK_TIMEOUT, 4);

是否有一种方法可以通过LDAP对用户进行身份验证,但不使用php的LDAP模块?不幸的是,大多数共享主机似乎没有ldap模块。目前,我已经在本地主机上使用ldap模块实现了以下功能,但我希望使用cURL或file_get_contents等替代方法实现同样的功能

$ldap_connect = ldap_connect("server.ip", 389);
ldap_set_option($ldap_connect, LDAP_OPT_NETWORK_TIMEOUT, 4);  

        $ldap_fqdn_user=$samaccountname. "@" . $ldap_domain; 

        if (!($bind = ldap_bind($ldap_connect, $ldap_fqdn_user, $ldap_password))) { 
            ldap_close($ldap_connect);
            echo "Incorrect Username or Password"; 
        } else {
            ldap_close($ldap_connect);
            echo "Correct username and password";
        }

幸运的是,curl本机支持LDAP。我自己从来没有用过它,但我想等效的curl_setopt应该是

curl_setopt_array ( $ch, array (
        CURLOPT_PROTOCOLS => CURLPROTO_LDAP,
        CURLOPT_PORT => 389,
        CURLOPT_URL => 'server.ip',
        CURLOPT_TIMEOUT => 4,
        CURLOPT_USERPWD => $ldap_fqdn_user . ':' . $ldap_password 
) );
下面是一个完整的工作示例,使用curl检查密码是否正确/错误

<?php
declare(strict_types = 1);
header ( "content-type: text/plain;charset=utf8" );
$ch = curl_init ();
curl_setopt_array ( $ch, array (
        CURLOPT_PROTOCOLS => CURLPROTO_LDAP,
        CURLOPT_PORT => 389,
        CURLOPT_URL => 'ldap.forumsys.com',
        CURLOPT_TIMEOUT => 4,
        CURLOPT_USERPWD => 'cn=read-only-admin,dc=example,dc=com:password' 
) );
if (curl_exec ( $ch )) {
    echo "correct password";
} else {
    echo "maybe wrong password? curl got an error. errno:" . curl_errno ( $ch ) . '. error: ' . curl_error ( $ch );
}
curl_close ( $ch );

幸运的是,curl本机支持LDAP。我自己从来没有用过它,但我想等效的curl_setopt应该是

curl_setopt_array ( $ch, array (
        CURLOPT_PROTOCOLS => CURLPROTO_LDAP,
        CURLOPT_PORT => 389,
        CURLOPT_URL => 'server.ip',
        CURLOPT_TIMEOUT => 4,
        CURLOPT_USERPWD => $ldap_fqdn_user . ':' . $ldap_password 
) );
下面是一个完整的工作示例,使用curl检查密码是否正确/错误

<?php
declare(strict_types = 1);
header ( "content-type: text/plain;charset=utf8" );
$ch = curl_init ();
curl_setopt_array ( $ch, array (
        CURLOPT_PROTOCOLS => CURLPROTO_LDAP,
        CURLOPT_PORT => 389,
        CURLOPT_URL => 'ldap.forumsys.com',
        CURLOPT_TIMEOUT => 4,
        CURLOPT_USERPWD => 'cn=read-only-admin,dc=example,dc=com:password' 
) );
if (curl_exec ( $ch )) {
    echo "correct password";
} else {
    echo "maybe wrong password? curl got an error. errno:" . curl_errno ( $ch ) . '. error: ' . curl_error ( $ch );
}
curl_close ( $ch );

一般来说,LDAP是一种内部/现场身份验证方法,共享主机没有理由允许这样做。您可以做的最好的事情是在本地服务器上有一个API,它在内部为LDAP服务器提供身份验证请求。虽然这本身就是一个安全风险。ofc您可以使用socket_uuAPI手动重新实现LDAP协议,但这需要大量的工作您可以使用PHP实现LDAP服务器协议,但您不想这样做。因此,明智的决定是不支持没有PHP的LDAP模块的设置。没有必要过分支持所有糟糕的设置。一般来说,LDAP是一种内部/现场身份验证方法,共享主机没有理由允许这样做。您可以做的最好的事情是在本地服务器上有一个API,它在内部为LDAP服务器提供身份验证请求。虽然这本身就是一个安全风险。ofc您可以使用socket_uuAPI手动重新实现LDAP协议,但这需要大量的工作您可以使用PHP实现LDAP服务器协议,但您不想这样做。因此,明智的决定是不支持没有PHP的LDAP模块的设置。没有必要过分支持所有糟糕的设置。您发布的代码不可读,甚至不涉及LDAP的不同身份验证机制(SSl、TLS、GSS-API、GSS-API+SASL)。您发布的代码只能在您与LDAP服务器位于同一网络中时使用,他们认为谁会公开端口389/636?发布一段未经测试的代码来做一些你不完全理解的事情有什么意义?@Mjh在他的示例代码中,他使用的是端口389,这是LDAP的未加密版本,所以是的,他想要移植的代码使用的是未加密的LDAP。如果你想使用LDAPS,它的端口通常是636,你必须使用CURLPROTO_LDAPS。另外,我当时没有访问IDE的权限,我使用IDE进行格式化,因此出现了格式化问题。。但我现在知道了<代码>发布一段未经测试的代码做一些你不完全理解的事情有什么意义?
好吧,因为从文档来看,理论上,这应该行得通。我想指出的一点是,您提供的代码块仅在特定场景中有效-该场景是通过cURL执行请求的计算机必须与LDAP服务器位于同一域/网络中。我想说的另一点是,你给了一个答案,当人们把它当成谷歌的时候,人们会把它当作绝对真理,而不是你完全测试的东西。你本可以扩展它,添加警告等等,但你没有。这就引出了我的问题——有什么意义?重点是收集假想的声誉。对吗?@Mjh你至少部分错了。我测试了代码,它工作正常,并且我与目标服务器不在同一域/网络中。是的,重点是收集假想的名声。另外,我对af感到厌烦。@Mjh看到更新后的帖子,现在有一个完整的、经过测试的示例代码,happy?您发布的代码是不可读的,您甚至不涉及LDAP的不同身份验证机制(SSl、TLS、GSS-API、GSS-API+SASL)的主题。您发布的代码只能在您与LDAP服务器位于同一网络中时使用,他们认为谁会公开端口389/636?发布一段未经测试的代码来做一些你不完全理解的事情有什么意义?@Mjh在他的示例代码中,他使用的是端口389,这是LDAP的未加密版本,所以是的,他想要移植的代码使用的是未加密的LDAP。如果你想使用LDAPS,它的端口通常是636,你必须使用CURLPROTO_LDAPS。另外,我当时没有访问IDE的权限,我使用IDE进行格式化,因此出现了格式化问题。。但我现在知道了<代码>发布一段未经测试的代码做一些你不完全理解的事情有什么意义?好吧,因为从文档来看,理论上,这应该行得通。我想指出的一点是,您提供的代码块仅在特定场景中有效-该场景是通过cURL执行请求的计算机必须与LDAP服务器位于同一域/网络中。我想说的另一点是,你给了一个答案,当人们把它当成谷歌的时候,人们会把它当作绝对真理,而不是你完全测试的东西。你本可以扩展它,添加警告等等,但你没有。这就引出了我的问题——有什么意义?重点是收集假想的声誉。对吗?@Mjh你至少部分错了。我测试了代码,它工作正常,并且我与目标服务器不在同一域/网络中。是的,重点是收集假想的名声。另外,我对af感到厌烦。@Mjh看到更新的帖子,现在有一个完整的工作、测试的示例代码,happy?