LDAP 篩選條件設計器
組出 LDAP filter、貼上解析與字元跳脫
條件設計
條件在瀏覽器內組成 filter,這一頁不會連到任何 LDAP 或 AD 伺服器,不需要 Bind DN 與密碼,也不會告訴你查得到幾筆。語法正確不等於伺服器查得到 —— schema、matching rule 與存取權限要另外確認。
環境只影響屬性提示與範本範圍,不是伺服器連線設定。切到 Active Directory 會多出 AD 專用的範本與擴充比對,那些條件在 OpenLDAP 上查不到東西,而且不會報錯。
範本
貼上一段 filter,這裡用剖析器(不是數括號)建出語法樹。有錯誤時會指出行、列與附近的片段,但不會替你改任何一個字 —— 自動修好的括號,位置往往不是你要的那個。
把一段值轉成 filter 裡可以直接使用的寫法。星號、括號、反斜線與 NUL 會編成十六進位;合法的 UTF-8 可讀字元原樣保留,非法或二進位位元組保留成十六進位序列,不會被替代字元蓋掉。這裡處理的是 filter 的值,不是 DN —— 兩者的跳脫規則不同。
篩選語法
尚未連線驗證
閱讀格式只是給人看的排版。複製與下載一律使用可直接貼上的單行版本,值裡的空白完全不動。
這裡只輸出 filter,不含 Base DN、scope 或 Bind DN。那些是搜尋設定的其他欄位,把 filter 貼到 Base DN 欄會直接失敗。
使用說明 7
群組邏輯、字元跳脫,以及這支工具無權替你保證的事
群組邏輯
AND 是全部都要符合、OR 是任一符合、NOT 是反過來。每個群組至少要有一個子條件,而 NOT 底下恰好只能放一個 —— 放兩個的話 filter 不合法,多數伺服器會直接拒絕。群組可以互相巢狀,本工具的上限是 10 層、200 個條件。
字元跳脫
依 RFC 4515,星號、左右括號、反斜線與 NUL 分別寫成 \2a、\28、\29、\5c、\00。中文之類的合法 UTF-8 會原樣保留;非法或二進位位元組保留成十六進位序列,不會被問號或替代字元蓋掉。
伺服器相容性
語法檢查通過只代表這串字合乎 RFC 4515。屬性存不存在、用哪一種 matching rule 比對、大小寫與排序規則怎麼算,全部由伺服器的 schema 決定。位元比對與群組鏈比對是 Active Directory 的擴充,一般 LDAP 不吃。
存在與空值差在哪?
(mail=*) 是「有這個屬性」,不管值是什麼;(mail=) 是「這個屬性的值是空字串」。兩者查到的東西完全不同,所以要空值必須自己明確選,欄位留白不會被當成有效的空字串。順帶一提,「不等於」產生的是 NOT 等於,它會連「根本沒有這個屬性」的物件一起收進來 —— 要排除的話得再加一個存在條件。
星號如何當一般文字?
你在值裡打的星號一律被當成字面星號,會編成 \2a。要做萬用字元請改用「開頭符合 / 結尾符合 / 包含」這幾種比對方式 —— 那裡的星號才是結構的一部分。反過來做的話,一個含星號的值會悄悄變成範圍大得多的查詢,而且不會有任何錯誤訊息。
AD 群組為何沒有全部成員?
memberOf 只反映直接成員,不含主要群組(Domain Users 通常就在這裡消失)也不含巢狀群組。要沿著群組鏈找,Active Directory 有專用的比對規則 1.2.840.113556.1.4.1941,但那是 AD 的擴充,其他伺服器不支援,而且大型目錄上很吃資源。另外「未設停用旗標」不等於「可以登入」—— 帳號還可能鎖定、密碼到期或受政策限制。
Filter 與 Base DN 有何不同?
Base DN 是「從目錄樹的哪裡開始找」,scope 是「往下找幾層」,filter 才是「要符合什麼條件」。三個是不同欄位,本工具只產生 filter。還有一件常被混在一起的事:DN 有自己的跳脫規則,跟 filter 的值不一樣 —— 一個組好的 DN 拿來當 filter 的值時,仍然要再經過這一頁的編碼。