【问题标题】:Validating first names and last names in PHP to store in OpenLDAP验证 PHP 中的名字和姓氏以存储在 OpenLDAP 中
【发布时间】:2012-07-06 08:54:31
【问题描述】:

您好,我正在尝试验证一些用户输入,但我不确定执行此操作的正确方法是什么。

我想验证用户创建表单的名字和姓氏字段。我在 Zend 框架中使用 PHP,所以我将编写一个验证器。在做了一些研究之后,我认为我真的应该允许所有 UTF8 字符,开头或结尾没有空格。我不确定正则表达式,但我稍后会发现,我很可能会使用 php 的 preg_match。

我将这些详细信息存储在 OpenLDAP 中,使用 sn 字段作为姓氏,将 givenName 字段作为名字。我应该如何限制名称? OpenLDAP 中的长度是否有限制,我需要检查它接受的字符还是接受所有字符?

我应该验证名字和姓氏,还是应该让用户输入他们想要的内容?

我为用户名使用了一个单独的字段,其中包含“text.text”,文本为 A-Za-z 字符。

我没有发布代码,因为我只是需要一些指导,不确定这里的最佳做法是什么。

【问题讨论】:

  • 您确定要这样做吗?仅使用 a-z 来验证姓名和/或姓氏非常困难。如果我合并了 Jeff-Jefferson 之类的姓氏怎么办?还是威廉四世?
  • 或者看看这些例子:link
  • 不,我只是用 a-z 验证用户名。这就是我要问的,我读过我应该只允许名字和姓氏的所有 UTF8 字符,但我担心 OpenLDAP 可以处理什么

标签: php validation zend-framework ldap


【解决方案1】:

验证名称是个坏主意。对于名称中允许的内容没有通用规则,尤其是当您还想允许非西方文字时。

这对 LDAP 提出了挑战,因为无法保证目录能够理解用户输入的字符集。不过有一个简单的解决方案:base64_encode() 将值存储在 LDAP 中之前,base64_decode() 将它们存储在输出中。

【讨论】:

  • 谢谢,这听起来是个好主意,那么长度呢?我似乎在 OpenLDAP 中找不到名称字段的限制
  • 没有设置长度,它取决于架构。我想这个长度会足够 - 你对 LDAP 服务器有多少控制权?
  • 好吧,我有开发者权限。我可以看到 sn 和 givenNames 有一个超类型的名称。 name 似乎有一个语法属性,其长度属性设置为 32768。这是它可以容纳的字符串的长度吗?回到验证,似乎我必须使用 base_64_encode 进行很多更改,因为该软件已经上线,我认为我最好的选择是检查名称是否符合 UTF8?
  • 如果您无法更改代码,那么您应该能够以任何格式存储任何字符,前提是您确保名称类型为a DirectoryString or an OctetString(最好使用DirectoryString)。我想长度将是 byte 长度,UTF-8 字符最多可达 4 个字节。但实际上 32768 仍然给你 8192 个字符,每个字符 4 个字节,你永远不会得到那个,因为当你到达 4 个字节序列时,你会从死语言和奇怪的标点符号/不可打印的字符中得到字符。跨度>
【解决方案2】:

无需验证名称。目录服务器模式指定所有属性的语法,包括givenNamesn。服务器将正确编码所显示的任何名称。如果DirectoryString 值以空格开头或结尾,服务器将对值进行base64 编码以进行存储。

尽管存在实际限制,但 LDAP 客户端不应假定服务器具有强制属性值的非零长度的能力。某些属性语法的长度定义为非零(例如DirectoryString),但没有定义上限,因此,客户端不应假定服务器强制执行上限。

另见

【讨论】:

  • 所以基本上你是说我不需要关心字符集和长度?
  • LDAP 客户端不应假定服务器强制执行属性长度,除非属性语法指示长度必须非零。至于字符集,客户端应该知道属性具有语法,并且服务器强制执行该语法。例如,uidNumber 是 'Integer' 语法,服务器不会接受 'abc' 作为 uidNumber 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多