Jouer avec l’objectGUID
Travaillant sur un annuaire Active Directory attaqué en php, j’ai eu besoin d’obtenir une référence unique sur certains objets de l’annuaire.
La doc Microsoft spécifie que cet attribut est défini à la création et qu’il n’est pas autorisé de le modifier, ce qui est bien la garantie que je souhaite. http://msdn.microsoft.com/en-us/library/ms679021%28VS.85%29.aspx
J’ai donc fait mon petit script pour interroger l’AD et récupérer l’objectGUID, pas de soucis jusque là. Là où ça s’est corsé, c’est tout simplement lorsque que j’ai voulu m’en servir dans une requête LDAP. En général ça marchait bien, sauf dans quelques cas… embêtant.
Tout d’abord, pour passer le paramètre en post ou en get, il est plus simple si il est sous forme de chaine de caractère, vous pouvez faire cette opération de la façon suivante :
bin2hex($ldapRes["objectguid"][0])
Pour se servir de cette objet dans une requête LDAP, on a ensuite naturellement tendance à faire l’opération inverse de bin2hex à savoir :
pack(‘H*’,$objectguidHex).
Cette méthode marchait pas trop mal sauf dans quelques cas. Là on pense qu’il faut éventuellement échapper quelques caractères, comme indiqué à la fin de cette page : http://msdn.microsoft.com/en-us/library/aa746475%28VS.85%29.aspx . J’ai donc écris ma petite fonction pour échapper les caractères *,(,),\,NUL,/. Cette ajout a résolu un certain nombre de problèmes mais certains persistaient..
J’ai relu la doc et cette ligne a attiré mon attention :
In addition, arbitrary binary data may be represented using the escape sequence syntax by encoding each byte of binary data with the backslash (\) followed by two hexadecimal digits. For example, the four-byte value 0×00000004 is encoded as \00\00\00\04 in a filter string.
On peut donc échapper toutes les deux valeurs hexadécimales. Ce qui me donne la fonction suivante :
function ldap_escape($str, $for_dn = false)
{
$out = ”;
$hexStr=$str;
for($i = 0;$i<strlen($hexStr);$i=$i+2){
$out .= ‘\\’.$hexStr[$i].$hexStr[$i+1];
}return $out;
}
Après plusieurs tests, j’ai aussi remarqué qu’il n’y avait pas besoin de repasser de hexadécimale au binaire pour faire une requête paramétrée par l’objectGUID. Ce qui me donne comme filtre :
$filter=’(&(objectCategory=person)(objectGUID=’.ldap_escape($upn).’))’
