1

情報を収集し、データを LDAP に挿入しようとする cgi に送信する Web フォームがあります。問題は、::ldap::add で変数を使用しようとしていて、それが機能しないことです。コードは次のとおりです。

if {[string length env(QUERY_STRING)] != 0} {
    set handle [::ldap::connect localhost]
    set dn "cn=admin,dc=mycompany,dc=com"
    set pw "myPassword"

    ::ldap::bind $handle $dn $pw

    set dn "cn=[ncgi::value givenName] [ncgi::value sn],ou=people,dc=mycompany,dc=com"

    set formValues [
            puts "cn        {{[ncgi::value givenName] [ncgi::value sn]}}"
            puts "displayName       [ncgi::value givenName] [ncgi::value sn]"
            foreach {key value} [ncgi::nvlist] {
                    if {[string length $value] != 0} {
                            puts "$key      $value"
                    }
            }
            puts "objectClass       top"
            puts "objectClass       person"
            puts "objectClass       organizationalPerson"
            puts "objectClass       inetOrgPerson"
    ]

    ::ldap::add $handle $dn {
            $formValues
    }

    ldap::unbind $handle

}

ただし、$formValues を LDAP に挿入する実際のエントリに置き換えると、問題なく追加されます。

私は TCL を初めて使用するので、このスニペットに明らかなエラーがあったとしても驚かないでしょう。

前もって感謝します!

4

1 に答える 1

3

大きな間違い:

  1. 角かっこは、出力ではなく、その中のスクリプトの結果を置き換えます。
  2. コマンドはputs文字列をstdout(またはファイル)に送信し、後で処理するためにそれらを保存しません。
  3. 中括弧は、その中のすべての置換を完全に破棄します。

修正は、listコマンドを使用して、で使用する説明を作成することldap::addです。例えば:

set formValues {}
lappend formValues cn          "[ncgi::value givenName] [ncgi::value sn]"
### Might need this instead; it depends on how you want to do the construction
# lappend formValues cn        [list [ncgi::value givenName] [ncgi::value sn]]
lappend formValues displayName "[ncgi::value givenName] [ncgi::value sn]"
foreach {key value} [ncgi::nvlist] {
    ### Could also use {$value ne ""} here
    if {[string length $value] != 0} {
        lappend formValues $key $value
    }
}
lappend formValues objectClass top
lappend formValues objectClass person
lappend formValues objectClass organizationalPerson
lappend formValues objectClass inetOrgPerson

::ldap::add $handle $dn $formValues

また、これらのキーがフォームからのものである場合は、検証を追加して、悪意のあるユーザーが追加のobjectClassesなどの予期しない追加機能を追加しないようにする必要があります。1オンスの予防は100重量の治療の価値があります。

于 2010-03-27T14:15:44.997 に答える