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命令将字符串发送到标准输出(或文件),并且不保存它们以供以后处理。
  3. 花括号完全取消了其中的所有替换。

修复是使用列表命令来构建描述以使用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。一盎司的预防胜过一百重量的治疗。

于 2010-03-27T14:15:44.997 回答