在较新的网站上似乎不太常见,但是我需要使用多个帐户(例如,用于支付帐单等)的网站阻止我创建带有空格的密码。这只会使事情更加难以记住,而且我知道密码对数据库的空间或编程没有限制,否则会进行加密或(禁止使用天堂符号)。那么,为什么在注册站点时通常会歧视空格键呢?
"insert into USERS (..., password) values (..., '" + $POST['password'] + "');"
:-S
在较新的网站上似乎不太常见,但是我需要使用多个帐户(例如,用于支付帐单等)的网站阻止我创建带有空格的密码。这只会使事情更加难以记住,而且我知道密码对数据库的空间或编程没有限制,否则会进行加密或(禁止使用天堂符号)。那么,为什么在注册站点时通常会歧视空格键呢?
"insert into USERS (..., password) values (..., '" + $POST['password'] + "');"
:-S
Answers:
网站上的密码有很多愚蠢之处。
您的密码必须为四个字符,并且只能包含数字。
(通过将密码限制为0001 .. 9999范围,您可以简单地将它们以数字,纯文本形式存储在数据库中)
您的密码必须以大写字母开头,并以数字结尾。
(通过这样做,开发人员或管理人员假设这实际上将迫使用户选择安全密码,而规则为“您的密码必须包含至少6个字符,并且至少包含一个大写字母,小写字母和一个数字”将魔术般地失败了)
您的密码包含无效字符
é
。
要么,
您的密码
y$₯46¥*A'xD<7&฿=ᴙcN&sF5_Ở!d
包含一些无效字符。仅使用拉丁字母和数字中的字符。
要么,
您的密码不能包含空格字符。
在这三种情况下,开发人员只是确保可以正确存储这样的密码。
在第一种情况下,如果在发送时é
会转换成%C3%A9
什么?还是如果数据库存储é
不正确怎么办?
在第二种情况下,如果PHP(为什么要使用PHP?)不能处理unicode,并且在收到这样的密码时发生了什么可怕的事情呢?如果<
性格引起麻烦怎么办?如果将&
字符解释为URL中的分隔符(假设由于某种原因,密码是通过GET而不是POST发送的)怎么办?如果'
数据库解释了该怎么办,因为猜测,我们不知道什么是SQL注入以及如何避免它?或'
转化成\'
什么?
在第三种情况下,如果在某些情况下(而不是在其他情况下)PHP(再次?)修剪空白怎么办?如果管理员(他们出人意料地以纯文本方式访问用户密码)丢失了,因为他们只看到一个空格,而用户却设置了三个连续的空格,怎么办?
在这三种情况下,这些歧义都可以通过测试(尤其是单元测试)轻松解决。但是在大量项目中,根本没有测试,也没有时间进行测试(但以后仍有大量时间进行调试)。
这意味着开发人员是否要考虑允许空格,unicode字符或ASCII 48..57∪65..90∪97..122之外的任何字符(数字,小写字母,大写字母)可能造成的后果,最简单的方法,当测试是不可能的,是只禁止他们。
我认为,这是禁止使用空格的唯一原因。Yannis Rizos给出了另一个与UX有关的原因。尽管从理论上讲是一个合理的理由,但实际上它根本不起作用:由真正关心UX的人创建的网站无法修复愚蠢的密码规则。相反,实际上禁止使用空格的网站大部分是由从未听说过UX的人完成的。尤其如此,因为从UX的角度来看,禁止任何字符确实很烦人,因为与密码相关的任何限制(包括有用的限制)都是最小字符数。
答案是历史
我们似乎忘记了很多这样的基础来自于,当存储没有有效的分类(在磁盘或内存),当我们的管理所有这些事物的能力是略小于它现在是一个时间同样自动系统的能力尝试破解同样也少了一些。
基于我们现在知道的知识和我们现在可以做的事情,有很多关于密码的怨言,但简单的事实是,我们经常将遗留思维和遗留系统结合在一起。
现在新系统应该有限制吗?我希望不要-现在更少的理由
恕我直言,使用现代哈希和/或加盐法存储密码以不允许在密码中留有空格的任何网站/应用程序都是愚蠢的。但是,某些遗留系统(在某处了解到此信息)仍然以纯文本形式传递密码-因此不允许在此处留空格可能有意义。另外,某些应用程序可能“剥离”它们接收到的所有字符串输入。因此,以空格开头或结尾的密码不是很好(当然,这是人为设计的,但是您可以想象几乎任何人提出自己的网站都不会发生这种情况)。允许在密码中留空格没有什么“坏”之处-正如您所指出的那样,DB不会禁止使用散列或纯文本版本。
实际上,我的大多数Windows朋友都不知道他们可以在密码中使用空格-因此,按照蒂姆·梅多拉(Tim Medora)的回答,网站所有者可能不想冒险使用lamahs(请原谅),或者其中一些人拥有误解和/或不知道空间可以提供的优势。
What's the point then?
另一个要点是,密码没有用户期望的熵。而且某些系统默认情况下会修剪GET / POST变量,对此行为的(不太可能)更改将导致更严重的问题。
出于同样的原因,很多网站都不允许在名称中使用连字符,撇号或非ASCII字母,即使在美国这是非常常见的做法,并且除简单允许之外,禁止这些字符还需要做更多的工作他们。
出于同样的原因,许多网站的单词过滤器也不允许您使用“自欺欺人”,“延缓”甚至“蓄积”之类的词(尽管许多常见的种族诽谤完全没问题),因此这样做也是出于同样的原因。
这是因为许多开发人员显然完全缺乏常识,或者在考虑可能的用户输入和方案时至少具有非常有限的想象力。他们中的一小部分可能正在处理错误信息(排除非字母数字字符在某种程度上是一种标准做法,或者散列算法或存储方法无法处理空格或特殊字符)。其他人可能只是懒惰-他们担心字符集问题,因此他们只是将输入限制在最小的字符空间内。然后可能是由于缺乏对真实威胁的理解而由于偏执狂而过度投入的输入验证/卫生。