2

我有以下用于 php 会话的 php 代码,并且想知道它是否真的安全。

// Session Security
ini_set('session.cookie_httponly', '1');
ini_set('session.session.use_only_cookies', '1');
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.cookie_lifetime', '0');
ini_set('session.cookie_secure', '1');

session_name("nameofsite");
session_set_cookie_params(0, '/', '.domain.com');

if (!isset($_SESSION))
    session_start();

if (!isset($_SESSION['id'])) {
    header("Location: /home.php");

    die();
}

当“用户”登录时 - 我通过执行以下操作重新生成一个新的会话 ID:

if ($worked['loginname'] == sha1($username) && $worked['password'] == sha1($password))
{
    echo Message("Please wait, you are being logged in.");
    echo "<meta http-equiv='refresh' content='1;url=index.php'>";

    $_SESSION['id'] = $worked['id'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

    session_regenerate_id(true);
}

我是否还应该检查 $_SERVER['REMOTE_ADDR'] 是否与 $_SESSION['ip'] 匹配?

我只想拥有一个安全的站点,这样会话就不会被劫持/窃取。

4

2 回答 2

3

您不应该检查 IP 地址,因为用户的 IP 可能因许多真实原因而更改。例如,手机从 WiFi 掉线到 3G,它们位于负载均衡器后面或使用 Tor 网络之类的东西。

于 2013-10-24T21:08:51.717 回答
2

安全会话处理

ini_set('session.entropy_file', '/dev/urandom');

这很好。确保session.entropy_length是一个合理的值:至少 16(128 位),小于或等于 64(512 位)。

我还应该检查是否$_SERVER['REMOTE_ADDR']匹配$_SESSION['ip']

可以将会话绑定到特定的 IP 地址,但正如 Scott Helme 所说,这对于 Tor / 3G / 开放 WiFi 用户来说会中断。我不推荐它。

当“用户”登录时 - 我重新生成一个新的会话 ID ...

是的。提升权限应导致会话 ID 重新生成。你这样做是对的。

其他注意事项

  • HTTPS 对于会话安全是强制性的;这是没有商量余地的。
  • 强烈建议使用Hypertext-Strict-Transport-Security 。
  • 仅将 cookie 用于会话 ID 存储。
  • 不要将 cookie 状态存储在 cookie 中;这个设计缺陷导致了我个人发现的流行框架和 CMS 中的许多安全漏洞。(包括,是的,CodeIgniter 和 Laravel。)它已成为我在审核 PHP 项目时首先要寻找的东西之一。

请参阅我们的文章PHP 会话安全以获得更深入的解释和您可能需要考虑的想法(例如,可以降低会话固定风险的金丝雀值,如果您只使用 HTTPS 上的 cookie,则不必担心)。您还应该确保您不会受到跨站点脚本漏洞的影响


用户认证

if ($worked['loginname'] == sha1($username) && $worked['password'] == sha1($password))

这是您问题中最不安全的部分。

  1. 你为什么要sha1()散列用户名?这似乎毫无意义。
  2. 你为什么要sha1()散列密码?那绝对是不安全的。

您应该使用适当的 PHP 加密工具来存储密码。在 PHP 5.5 和更新版本中,我们有password_hash()password_verify(). 对于早期版本的 PHP(最低 5.3.7),您可以使用ircmaxell/password_compat

安全的用户身份验证具有挑战性,尤其是当长期身份验证(即由“在这台计算机上记住我”复选框设置的 cookie)进入等式时。

于 2015-08-11T22:34:37.650 回答