5

作为我的网络应用程序的一部分。这是我正在考虑的一些代码(我不是最好的 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 的想法哈!

更新 - 我的方法的伪代码。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
4

1 回答 1

3
  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));
    }
    

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

--

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

  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 数据库。即使在专用服务器上,如果没有适当的内部网络安全措施,您也会被搞砸。

于 2011-11-14T09:58:38.417 回答