PHP安全会话登录-最佳实践


PHP Secure Session Login - Best Practice

作为我的web应用程序的一部分。这是我正在考虑的一些代码(我不是最好的PHP程序员,但我为一个项目编程我自己的应用程序):

// Start session
session_start();
// Is the user already logged in?
if (isset($_SESSION['username'])) {
    header('Location: members-only-page.php');
}

我想知道,如果我的登录结构是这样的,这是安全的。

  • http://site.com/
  • https://site.com/login.php
  • https://site.com/login-action.php (MySQL登录检查,md5密码检查)
  • http://site.com/cp/members-only-page.php

我正在使用MD5();但我对脚本使用的整个$_session["user"]="1"方法并不完全满意;像vBulletin这样的网站肯定不会这么做吧?

感谢您的回复。我甚至还没有涉及到Ajax的概念!

UPDATE -我的方法的伪代码。

// vars
login string post
password string post
// validation aside from ajax now
login string is empty
redirect to login form with error
password string is empty
redirect to login form with error
// mysql
escape strings
clean html strings
mysql connect external mysql server
if login string is user
    if password md5 match with database md5
        session logged in
    else
        session failed password invalid
        redirect to login form user/pass error
    end if
else
    session failed username invalid
    redirect to login form user/pass error
end if
if file called direct
    redirect 404
    alert_admin function type hacking attempt login page
end if
  1. mysql_real_escape_string() not保护您免受所有形式的SQL注入或其他类型的攻击。您应该使用一个包含代码的系统来单独防范许多保护措施,我在测试服务器上使用了一个这样的例子(对于生产来说不够强大):

    function sanitize($str)
    {
      $str = trim($str);
      if (get_magic_quotes_gpc())
        $str = stripslashes($str);
      return htmlentities(mysql_real_escape_string($str));
    }
    

请阅读这个问题的公认答案,看看为什么你过滤用户输入的任何方法都不是完全可靠的。

,

关于保护用户登录的信息,请考虑以下提示:

  1. 尽可能避免用户输入,如果不可能;
  2. 不要使用仅使用 md5来保护用户密码。它很容易解密。
    • 考虑使用密码盐,每个用户唯一。
  3. 让你自己的密码既长又多样。
    • 可选择扩展这些作为建议到您的用户密码。例子:
      • 长度至少为6个字符。
      • 必须包含字符的混合大小写。
      • 必须包含至少一个数字。
      • (Secure)必须包含至少一个符号。

密码强度的基本原理和统计数据:

我(使用nVidia NVS 3100M移动显卡)可以以每秒56,900,000个密码的速度破解或"暴力破解"MD5或SHA1哈希。这意味着我可以完成所有长度为1 - 6个字符的密码,使用完整的(a- za - z0 -9 +符号)字符集;不到四分钟。想象一下,一个拥有一台像样的电脑(甚至是一台游戏电脑)或服务器的人可以做些什么。

防止这种情况发生的方法是给你的密码加盐。根据您对密码的处理方式,"攻击者"需要尝试许多不同的解密方法才能猜出您的任何用户的密码。如果你的密码没有加盐,他们可以用我上面描述的方式暴力破解。

阅读更多PHP会话安全信息:

PHP安全指南-会话安全

PHP Session Security (StackOverflow)

会话安全说明(SitePoint)

Also Worth Nothing:

你需要决定你的网站需要保护什么。如果您的网站托管在共享服务器或共享主机上(无论是VPN, VPS还是某种半专用解决方案),您将始终面临系统上其他恶意用户访问您的PHP文件的风险,并且扩展;MySQL数据库。即使在专用服务器上,如果没有适当的内部网络安全,你也一样完蛋了。