我唯一能想到的就是不力地阻止SQL注入,但这会假设密码没有被散列(我希望那不是真的)。
#1 楼
我在这里没有看到的一种解释是,许多金融机构都与较早的系统紧密集成在一起,并且受到那些系统的局限性的影响。具有讽刺意味的是,我已经看到了构建的系统为了与旧系统兼容,但现在旧系统已经不复存在,并且仍然必须存在该策略,以便与为与旧系统兼容而构建的新系统兼容。
(这里的教训是,如果您必须与旧系统兼容,请在将来消除这些限制)。
评论
这是安全性的主要问题。 +1至少在我看来指出了IT安全的最大缺陷之一。
– Nomad101
13年4月29日在10:38
当然,这意味着密码不是以哈希格式存储的。如果对它们进行哈希处理,那么即使是较旧的系统也不会成为问题。
–NotMe
15年1月28日在15:14
这可能是解释的一个很好的部分……具有讽刺意味和悲伤。
– Francesco
15年12月29日在14:35
#2 楼
支持费用呢?假设我们允许任何人创建由€
个字符组成的密码。欢呼,我们可以在密码中使用特殊字符。但是,等等-如果我们想通过手机访问银行,到底该如何输入密码?用键盘输入€
比用手机输入要容易。假期怎么样?我们在英国,只能访问英国键盘。代替
€
,我们可以轻松地键入£
。单词easily
在这里非常重要。对于一些普通用户而言,键入“新”键盘的字符可能是个问题。他将如何解决这个问题?他可能会致电银行支持部门,要求他们更改密码或询问why the € character dissapeared from his keyboard
。 评论
无论如何,这都是一个问题,在中文或阿拉伯语键盘上输入英文密码有多么容易,至于我的手机,您要求的所有这些字符都可以在uk布局模式下立即访问。无论键帽上的标记是什么,都可以在OS上切换布局并按相同的键对。
– ewanm89
2012年7月14日在9:54
我知道这只是猜测,但是无法弄清楚如何重新输入密码并认为键盘上“消失的”键的用户类型可能不是用特殊字符编写巧妙的密码,而是使用了诸如goldfish2之类的密码。
–韦斯利·默奇(Wesley Murch)
2012年7月16日14:27
绝对废话。如果您使用任意字符创建密码,那么只有您应该关心如何重新输入这样的密码。毕竟这是您自己的决定!任何类型的输入都应允许以任意长度的密码作为密码,尤其是对于像银行帐户这样重要的事情。无论如何,我们都在对密码/密码进行哈希处理,限制字符集绝对没有意义。这是完全的疯狂。
–hijarian
13年3月16日在8:30
限制(无论是禁止使用特殊字符还是强制使用特殊字符)都不能使用户更轻松。如果没有其他要求,它将使某些用户无法使用其“常用”密码,并迫使他们创建/记住另一个密码(由于其他原因,您可能会希望使用该密码,但客观上仍然令人讨厌,因此并不“容易”)。
–放松
2013年9月11日7:14
这是我没有尝试将密码更改为私は何か和其他非ASCII变体的唯一原因。我不能保证我可以在需要的地方输入
–伊兹卡塔
15年1月26日在21:26
#3 楼
这可以(弱地)证明是纵深防御措施-如果存在注入或其他数据解释错误,限制密码字符集和长度可能会阻止其被利用。它还稍微简化了实现,因为如果它们仅处理7位ASCII字符,则Unicode和多字节字符串处理是无关紧要的,并且较简单的实现通常不太可能包含错误。但是,评估这种降低的风险与降低密码质量所导致的风险增加之间的关系并不简单-我希望随着系统用户数量的增加,可能被泄露的密码数量也会随之增加,从而加大了对取消此类限制的投资值得。话虽如此,即使该字段完全不受限制,大多数用户的密码也会很糟糕。
评论
是的,或者只是将密码转换为十六进制或base64编码,然后再将其存储在数据库中。密码是最重要的一项安全功能。可能应该值得做对。老实说,无论如何,数据库应该看到的密码的唯一部分是哈希,该哈希始终是纯二进制的。
– ebyrob
18年11月1日在21:01
#4 楼
我的猜测是该策略适用于所有用户输入的字段,并且为简单起见,将相同的用户输入策略(无特殊字符)应用于包括密码的字段。或者在某个时候,某些银行没有对密码进行哈希处理,而是通过其密码字段进行了SQLi攻击,因此决定了一项策略,规定密码不能包含特殊字符(一旦引入哈希,便会忘记该策略的原因)。 br />绝对有安全优势,不允许在其他用户输入的字段中输入不经过哈希处理的特殊字符,这些特殊字符可用于各种攻击,例如SQLi或XSS(在查看帐户的银行管理员那里)。但是,通常可以通过在SQL中始终使用绑定参数并在显示/保存到db之前总是对用户输入进行清理来解决这些威胁。
我的另一个猜测是,他们希望拥有可能不同的自定义规则从其他地方访问,因此您不能轻易地重复使用标准的强密码(该密码可能会丢失),并且不得不为他们的网站提出一些独特的建议。
编辑:在其他地方我认为,根据语言的不同,我可以想到至少三个特殊的ASCII字符,通常应该禁止/剥离它们,因为它们只会诱惑命运。特别是:
\r
(null-ascii 0),因为它通常用于指示C风格语言的字符串结尾(可能用户在字符串结尾之后更改内存)。还有回车和换行符\n
(ascii 13)和\r\n
(ascii 10),因为无论换行符是\n
还是,./<>?;':"[]{}\|!@#$%^&*(-=_+
,它们通常取决于系统,这带来了不可避免的问题,我只能从Windows而不是Mac / Linux机器上登录。实际上,仅允许可打印的ascii(32-126)并禁止不可打印的ASCII 0-31和127似乎很合理。但是,如果用特殊字符表示的是unicode而不是ASCII字符(如
2b 41 38 41 2d
,则从多个操作系统/键盘/浏览器简化实现似乎是合理的,不允许使用特殊字符。请想象您的密码中使用小写的pi。这是希腊pi吗? (π)代表代码点0x3c0或科普特小写pi(ⲡ)代表代码点0x2ca1-只能工作一个,并且在Unicode中存在具有不同代码点的类似字符的这种类型的问题。能够将两个π等同,因此,如果您尝试在不同的位置登录,则可能会输入不同的字符。类似地,尽管这个问题是程序员可以很大程度上控制并尝试进行纠正的,但允许使用Unicode字符会产生编码问题。也就是说,对于您的基本ascii字符来说,所有内容都以一个字节的数字表示。但是,对于编码unicode的方法有很多不同的方案。例如UTF-7,UTF-8, UTF-16,UTF-32,Latin-1(iso-8859-1),Latin-N编码,以及(对于某些编码)字节顺序(小字节序或大字节序)是什么? pi(0x3c0)的Unicode代码点将表示为UTF-7中的字节
CF 80
,UTF-8中的FF FE c0 03
,UTF-16中的FF FE 00 00 c0 03 00 00
和UTF-32中的A1
。您将无法用Latin-1表示pi(它只能包含95个额外的可打印字符),但是如果您的密码中包含¡ĄĦЁ‘ก”Ḃ
且使用不同的编码,则可能必须使用以下任意字符q4312079q来表示pi (在某些拉丁语-N中可能是A1)。是,网页可能已定义了字符集,但用户可以在浏览器中覆盖页面上的字符集,或者已从其他位置复制和粘贴了数据以不同的编码归根结底,禁止这些字符可能更简单。
评论
几乎所有存储与您的个人信息和现金有关的数据的金融机构都经过了严格的安全审核,在系统进行任何重大更改后都应重复进行此审核。因此,很难相信第二段中的信息。
– p____h
2012年7月13日在22:07
p___h-您的评论没有任何意义。安全审核的一部分将查找绑定参数等内容
–Rory Alsop♦
2012年7月13日在23:08
@p____h金融机构往往是制定自己的规则和法规以进行审计的机构,但这并不总是最佳做法。当他们重复任何审核时,这也取决于他们。
– ewanm89
2012年7月14日在1:31
当这些机构要收集任何个人数据时,应该没有任何法规吗? AFAIK,并不是每个人都可以处理个人数据,您需要获得许可并遵守规定,以处理它们(或者可能取决于国家/地区)。
– p____h
2012年7月14日在1:45
@drjimbob“悄悄地将字符从其他字段中剥离(例如注释),”为什么?您能否仅指出“您的注释中包含不允许使用的这些字符(...)”?
–好奇
2012年7月16日下午4:55
#5 楼
概括地说,这是金融机构限制长度和字符集复杂度的最常见原因。(1)Web服务是传统大型机应用程序的前端系统,通常具有八个字符限制仅由小写字母和数字组成。没有“特殊字符”。奇怪的是,这是最常见的限制。对上面的Mark Burnett +1。
(2)它们没有对密码进行哈希处理,因此它们不能简单地存储固定长度的数字字符串(即哈希输出-32字节的SHA256(password)) )。因此,他们必须担心限制输入的大小。
(3)如果将密码存储为明文,则SQL注入威胁向量仅是密码问题。当组织通过存储散列密码(理想情况下使用PBKDF2之类进行加密和扩展)来解决问题时,许多组织和其他组织都在浪费时间担心转义密码字符。
除了支持简单的客户支持密码重置OVER安全性外,我不知道有任何可接受的理由可以从用户设备中以明文形式发送用户密码。您不希望承担责任,因此请不要接受。这就是加密散列的用途。
这是一篇很棒的博客文章,总结了一些最佳实践,并包括了代码示例。 http://crackstation.net/hashing-security.htm
评论
我不会考虑将密码散列为SQL注入的解决方案。如果您的代码在不对输入进行散列的情况下很容易受到攻击,那么您会遇到麻烦。并非所有输入都是密码。通过将绑定变量与准备好的语句一起使用,可以立即解决该问题。
–布兰登
15年4月22日在23:11
不过,在这种情况下,他特别是指密码。所以...哈希绝对是对SQL注入密码字段(与准备好的语句一起)的一种解决方案。
–凯尔·法里斯(KyleFarris)
15年5月6日在20:11
无论如何存储密码,都可以使用准备好的语句来阻止SQL注入。如果没有准备好的语句,则无论如何存储密码,都有冒险引入SQL注入漏洞的风险。密码不是SQL注入的问题。
–jordanbtucker
17年2月14日在5:03
#6 楼
我实际上问过一个大网上商店(bol.com,不确定它们是否是国际性的)。他们的建议是使用强密码,经常更改它,使用字母和数字,应该是时间长了,也许还有其他我忘记的事情。无论如何,没有人遵循的通常建议。但是他们似乎在乎密码策略。
但是它们不允许使用大多数特殊字符,并且最大密码长度为12个字符。在询问后,他们告诉我,否则会有太多人与支持人员联系。
当我发回邮件询问他们“忘记密码?”的内容时,功能是针对我的,我没有回信...
因此对于银行来说,通过电子邮件进行简单的密码重置是不可能的,我想支持费用确实是原因(如其他人在这里)。对于像bol.com这样的任何其他网站,我将非常不信任它们是否会哈希密码。如果数据库泄漏您的密码将是已知的,则应在此处使用一个更独特的密码。
#7 楼
将字符集限制为字母数字可限制脚本或漏洞利用程序通过输入验证阶段的可能性。用户始终可以使用更长的密码来提高安全性,但是应用程序需要具有特定的白名单以帮助防止攻击。
评论
(因为我敢肯定会出现这种情况……)在仍然允许密码中包含特殊字符的同时,没有更好的方法来防止此类脚本/漏洞利用吗?
– Iszi
2012年7月13日在20:47
如果仅在使用密码之前对其进行哈希处理,为什么还要验证密码呢?
–加里
2012年7月13日在20:48
而且它允许有针对性的攻击来限制其范围并减少可能的密码的熵。当然,对密码的输入验证应该是完整的字符集,并且应该直接传递给哈希算法?
– ewanm89
2012年7月14日在1:24
@Iszi-当然,但这很容易
–Rory Alsop♦
2012年7月14日在9:20
罗里说了什么。是的,如果您始终使用正确的转义字符来正确处理字符,那么您是安全的。但这需要编码人员知道他们在做什么,而他们在金融行业却供不应求。快速轻松地解决问题要容易得多。
– bobince
2012年7月14日在12:24
#8 楼
我可以尝试以UI界面设计师而不是程序员的身份来解决上面的问题:关键是登录要求部分是UI界面设计问题,而不是仅编程问题。有一本很棒的书“ Apress-程序员的用户界面设计”,其中显示了与窗口大小相关的类似问题,我将在下面发布:
这是程序员常见的思维模式:只有三个
数字:0,1和n。如果允许n,则所有n的可能性均相同。
这种思想模式来自于旧的编码约定(可能是
smart),您的代码中不应包含任何数字常量
, 0和1。
现在,上面的想法在仅编程问题中是正确的,但是由于它涉及用户界面,尤其是Windows,因此不是
但事实并非如此。事实证明,可能性不大。
有很多很好的理由,为什么您希望窗口恰好位于屏幕的顶部(最大化屏幕空间),但实际上并没有任何理由留下两个像素在屏幕顶部和窗口
之间。因此,实际上,0比2更有可能出现。
现在出现了我们的问题,从编程和形式上看,从理论上讲,所有字符都应具有相同的可能性和均等的允许,但是在这里,我们也处于UI界面问题实例中,我们必须意识到这一点,并为其赋予正确的权重。
所以我从上面的线程中解释一个答案,我认为是正确:
假设我们允许任何人创建包含€
char的密码。祝您好运,我们可以在密码中使用特殊字符。
但是,等等-如果我们想通过手机访问银行,该如何输入密码?键入€
更容易从我们的键盘而不是从手机。
从可用性的角度来看,这是主要观点,如果他在几年后意识到使用智能手机,就不应将其归咎于用户在甚至还不存在几年之前,他就使用了应该避免的角色。
考虑这类问题并让用户避免它是我们的义务!
评论
您最后一个突出显示的段落是不错的,但是前面的文字必须与大部分内容无关。
–超级猫
16-10-14在23:29
#9 楼
开派对有点晚-我最近读到,原因是对于许多银行来说,实现这些字符所增加的安全性的价值超过了实施成本和与无法记住密码的客户打交道的支持成本。 。我并不是说这是一个很好的理由,但这就是我解释所读内容的方式。
http://www.theglobeandmail.com/technology/digital-culture/why-canadas-banks-have-weaker-passwords-than-twitter-or-google/article18325257/
评论
由于实际上通过增加密码长度来提高安全性更容易,所以有人在自欺欺人。可能使用特殊字符的人也不太可能忘记它们...
–钟表缪斯
15年3月17日在13:51
这不是p____h的答案所涵盖的吗?
– schroeder♦
15年3月17日在15:09
#10 楼
还有一个原因!一些特殊字符会根据使用的键盘更改其位置。例如,在US-EN和日语键盘混合环境中,at标记(@)和星号(*)位于不同的键上。如果我每次因用户使用错误的键盘方案而被锁定而要给我一角钱...好吧,我约有一美元左右,但是您明白了。评论
因此,您要说的是,不应允许用户使用a和m以外的任何其他字符,因为他可能偶然使用了dvorak键盘布局。
– SOFe
20 Jan 20 '20 at 4:51
评论
即使加密也没有任何意义,现代加密技术是在二进制级别进行的。但是,我将让您考虑需要从密码中输入x,y和z字符的银行等。特殊字符是指ASCII特殊字符,例如../<>?;'::[]{}\|!@#$%^&*(-=_+或Unicode字符€,£,♥为p____h的建议答案?
如果您要通过android访问帐户,Ally Bank不建议在密码中使用特殊字符。完全愚蠢。至少像?这样的标准字符?应该被允许。
有时,没有技术原因。看到一个关于密码长度类似问题的出色(有趣的)回答:security.stackexchange.com/questions/33470/…
这是姐妹网站上的另一个非常类似的问题