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

The*_*Kid 5 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');
}
Run Code Online (Sandbox Code Playgroud)

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

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

感谢答复。我什至还没有想到过将其作为Ajax的想法!

更新-我的方法的伪代码。一切都在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
Run Code Online (Sandbox Code Playgroud)

cbr*_*ton 4

  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));
    }
    
    Run Code Online (Sandbox Code Playgroud)

请阅读此问题已接受的答案,以了解为什么过滤用户输入的任何方式都不是完全可靠的。

--

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

  1. 尽可能避免用户输入,如果不可能的话;清理他们的输入。
  2. 不要使用md5 来保护用户密码。 很容易解密。
    • 考虑使用每个用户独有的密码盐。
  3. 确保您自己的密码既长又多样化。
    • (可选)将这些作为建议扩展到您的用户密码。例子:
      • 长度必须至少为六个字符。
      • 必须由大小写混合的字符组成。
      • 必须至少包含一个数字。
      • (安全)必须至少包含一个符号。

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

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

防止这种情况的方法是给你的密码加盐。根据您对密码加盐的方式,“攻击者”需要尝试许多不同的解密方法,然后才能猜测您的任何用户的密码。如果您的密码没有加盐,他们可能会按照我上面描述的方式对其进行暴力破解。

阅读有关 PHP 会话安全性的更多信息:

PHP 安全指南 - 会话安全

PHP 会话安全 (StackOverflow)

会话安全注意事项 (SitePoint)

也一文不值:

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

  • mysql_real_escape_string() 需要什么?! (3认同)