PHPのldap_bindは全く関係ないんですけど、PHPとADを使ったお仕事で出てきたので、覚書程度に書かせてください。
注意:当方、LDAPの知識もADの知識も全くございません。認識を誤った記述をしている場合があります。
やりたいこと
せいかい
おとなしくユーザのDNを指定する。
このやり方で出来るのに、なんで"ryozi@hoge.localなフォーマットじゃないとダメ!!"という情報があるのかわからん。
当時はダメで、現在はサポートしてくれるようになったんだろうか?
$ok = @ldap_bind("cn=ryozi,ou=kaihatu,dc=hoge,dc=local", "パスワード"); if(!$ok){ die("bind failed."); } echo("bind successed");
OpenLDAPのときと若干違うけど、それはまぁ何とかなる範囲でしょう。
追記
やっぱり嘘でした!変だと思ってたわ!知ってた!!
「ryozi@hoge.local」な認証は、
属性sAMAccountNameに"ryozi"とある場合に有効で、
属性CNに"ryozi"という値が入っている保障がないから。両方同じならどちらの形式でも当然通る。
なのでsAMAccountName(Windowsログオン時のアカウント)でやるなら、
- 管理者DNで認証→IDをsAMAccountNameで検索→得られたDNの値の検証→DNの値を使って認証(OpenLDAPでも通用)
- 「ID@ADのドメイン名」で認証→IDをsAMAccountNameで検索→得られたDNの値の検証(OpenLDAPでは使えない)
このどちらかかなー。
前者はOpenLDAP互換だが、信頼できるアカウントが必要。
後者は前者より手数が少なくて済むが、AD依存。
「"ryozi@hoge.local"な形式じゃないとダメ!!1」
みたいな記事ばかりで、ADも買えない貧乏な僕はがっかりです。
だいたいそういう記事に限って「LDAPでやり取りするとき、入力されたIDを使う際、こういうエスケープ処理が必要」ってのもないし。
bind時のDNを構成するときのエスケープと、フィルタのエスケープの2つについて言及してるところが余り見ないところをみると、
結構、LDAPインジェクションできちゃうんじゃね、とか思うわけです。はい。
(LDAPについて言えば、ちゃんとRFC2253,RFC2254にかかれてます。ADは知らない。)
*1:4年前だから事情が変わったのかもしれんが。