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

时间:2011-11-14 09:27:02

标签: php session secure-coding

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

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

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

  

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

感谢回复。我甚至没有触及过这个Ajax ha的想法!

UPDATE - 我的方法的Psuedo代码。 SSL上的所有内容。

// 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 个答案:

答案 0 :(得分:2)

  1. mysql_real_escape_string() 可以保护您免受所有形式的SQL注入或其他类型的攻击。您应该使用一个系统,其中包含代码以防止单独的许多安全措施,这是我在我的测试服务器上使用的一个例子(不够强大,无法生产):

    function sanitize($str)
    {
      $str = trim($str);
    
      if (get_magic_quotes_gpc())
        $str = stripslashes($str);
    
      return htmlentities(mysql_real_escape_string($str));
    }
    
  2. 请阅读this question的已接受答案,了解为何过滤用户输入的方法永远不会全面展示。

    -

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

    1. 尽可能避免用户输入,如果不可能;消除他们的意见。
    2. 请勿使用 md5来保护用户密码。 It is easy to decrypt.
      • 考虑使用密码盐,对每个用户都是唯一的。
    3. 保持自己的密码既长又多样。
      • (可选)将这些作为建议扩展到用户的密码。例:
        • 长度必须至少为六个字符。
        • 必须由混合字符组成。
        • 必须至少包含一个数字。
        • (安全)必须至少包含一个符号。
    4. 有关密码强度的基本原理和统计信息:

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

      避免这种情况的方法是加密密码。根据您对密码加密的方式,“攻击者”需要尝试许多不同的解密方法才能猜出您的任何用户密码。如果您的密码没有被腌制,他们就可以按照我上面描述的方式强制使用它。

        

      了解有关PHP会话安全的更多信息:

           

      PHP Security Guide - Session Security

           

      PHP Session Security (StackOverflow)

           

      Notes on Session Security (SitePoint)

      也值得一无所获:

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

相关问题