PHP Advanced&安全认证

时间:2010-10-27 20:51:05

标签: php

我总是通过检查表单中用户提供的传递的MD5 +盐是否与存储在数据库中的那个相同来制作我的验证码,如果是,我保存了一个名为“”的会话变量状态“,等于1.他被记录了。

我很确定这是错误和不安全的,但我从未见过任何其他方法。你们能帮助我吗? :)

4 个答案:

答案 0 :(得分:7)

网站安全没有简单的解决办法,所以对长期答案表示道歉:

如何在用户登录后识别用户?如果它在URL中有会话ID,则可以读取并且会话被劫持。如果它是标准cookie,则可以再次读取cookie并且会话被劫持。这与密码上使用的散列函数的类型无关。

为了安全起见,请使用SSL(或类似的加密)并使用安全标志设置会话cookie。

麻烦的是,您只能通过SSL验证用户的身份。为了避免必须通过SSL提供网站的所有页面,必须使用两个会话cookie,一个是安全的,并在安全认证(登录)期间启动另一个标准,并在用户首次点击非SSL页面时启动。必须通过SSL提供任何私人或受保护的数据,并在每次点击时检查安全cookie。

当然会话数据应存储在数据库中,而不是cookie中。 cookie中只应使用会话ID或类似的唯一字符串。

这样,任何试图劫持活动会话的人都只能获得非ssl页面。

IP地址可能是欺骗性的,与用户代理相同,因此不应将这些用作用户标识的一部分。此外,用户的IP地址可能会在会话期间发生变化(例如,在负载均衡器,匿名者或某些ISP之后),从而导致注销。

还要注意廉价的SSL证书。它们并非都安全。

不幸的是,PHP的原生会话处理并不安全,因此良好的应用程序设计至关重要。

当涉及到用户密码时,强制使用包含大写,小写数字和符号字符混合的长(最少8个字符)密码。

在一定次数的登录尝试失败后,通过阻止用户一段时间来防止暴力攻击。

如果您提供通过电子邮件重置密码的工具,请确保您知道用户保护其电子邮件帐户。

事实上,没有什么是100%安全的,但我们可以非常接近,这些是实现这一目标所必需的主要步骤。

当然,安全性是相对的,您应该保护用户数据的长度取决于数据的内容以及您的网站可能有多少目标。如果您存储信用卡详细信息并且它是一个受欢迎的网站,那么安全性是至关重要的。

如果您存储信用卡详细信息,那么您还需要达到相关的PCI合规水平。

答案 1 :(得分:3)

您应该使用更强的哈希,例如SHA512。

答案 2 :(得分:1)

我同意远离MD5但也可能通过重复几次来扩展哈希。关于安全的更多想法:

单独进行会话检查很容易受到会话劫持(AKA sidejacking)的影响,我会在会话中存储一个唯一的id,并将其与用户IP和浏览器UA字符串一起存储在DB记录中,以帮助缓解此问题。在某种程度上(另见Firesheep)。

如果您没有使用SSL提交登录表单,那么您的密码将以纯文本格式发送(或者如果您使用的是基本HTTP身份验证,则它将被非常弱地混淆而不加密)。我会考虑一些client-side hashing系统或使用摘要式身份验证。

答案 3 :(得分:0)

This is basically the standard tut用于在PHP中创建高质量的面向对象的登录系统。我认为它涵盖了大多数基础并且经过深思熟虑它也非常接近你正在做的解决方案。