5

私が取り組んでいるphpページでは、LDAP接続が確立され、そこからcnエントリのリストがプルされてドロップダウンに入れられます。ドロップダウンからの選択は、フォーム送信を介して別の php scrips に送信され、選択された cn を LDAP に対してチェックして、より多くの関連情報を取得します。

ほとんどの名前では、これは問題ありません。ただし、ニックネームを囲む括弧を含む cn が最近追加されました。その名前が選択されると、ldap_search() メソッドは false を返します。以下はコードです。 $employeename はサニタイズされた従業員名です。

...

$dn = "cn=users,dc=our-domain,dc=com";
$filter = "(cn=".$employeename.")";

$attrs = array("cn", "mail");
$rslt = ldap_search($ldapsvr, $dn, $filter, $attrs);

$entries = ldap_get_entries($ldapsvr, $rslt);

...

$filter 文字列は次のようになります

(cn=First (FN) Last)

ここで、First は名、Last は姓、FN は含まれるニックネームです。かっこを \28 および \29 としてエスケープしようとしました (ここで提供されているように、一致するかっこをエスケープする必要はないとも述べています) が、役に立ちませんでした。機能する名前には、文字、スペース、およびピリオド (ミドル イニシャル) が含まれます。

(cn=First \28FN\29 Last)

編集: ldap_search は、死ぬのではなく、false を返しています。調査中に含めた行の 1 つは、$rslt が false で配列でない場合、失敗して終了します。

編集:内側の括弧のみをエスケープしました。アウターは何のトラブルも与えなかったので

4

2 に答える 2

3

オペランドを一種の操作順序として追加してみてください。title次のようにするまで、フィールドで同様の問題が発生しました。

$filter = "(&(cn=$employeename))";

()一部のシステムでは、 .でエスケープする必要があります\

$filter = "(&(cn=James \(Jim\) Doe))";

ちょっと待って、エスケープ関数に取り組んでいます。

于 2012-07-20T15:29:34.853 に答える
0

検索フィルターのアサーション値では、括弧をエスケープする必要があります。参照:rfc4515(セクション4)。

于 2012-07-20T17:11:25.757 に答える