正确使用PHP会话

时间:2014-06-10 19:25:35

标签: php session login session-cookies logout

我正在使用PHP和MySQL创建一个Web门户,供用户使用单点登录方法登录和访问各种工具。一些工具包括phpMyAdmin和Piwik。着陆页将显示他们可以使用的所有工具,而无需单独登录。

会话称为“门户网站”。

我有以下文件: index.php - 检查它们是否已登录。如果已登录,则显示包含工具列表的页面。

login.php - 提供登录表单,创建会话,并在获得授权后重定向回index.php

logout.php - 提供了一个用于销毁会话的注销功能。

由于我在过去的4年里没有使用过PHP,所以我发现很多东西都有可能发生变化。

以下是每页使用的脚本。

的index.php

<?php
session_start();

if(!isset($_SESSION['user']) || (trim($_SESSION['pass']) == '')) {
header("location: login.php");
exit();
} else }
  // show list of tools (secure area)
}

?>

的login.php

<?php
if (!empty($_POST)) {
  session_set_cookie_params(0, '/', '', 0); // NOT SURE WHAT THIS DOES?
  session_name("Portal");
  session_start();

  // check if credentials match
  ...code...

  // if credentials are ok
  $_SESSION['user'] = $_POST['user'];
  $_SESSION['pass'] = $_POST['pass'];
  session_write_close();
  header('Location: index.php');
} else {
  // show login form
}
?>

logout.php

<?php
session_start();
$_SESSION = array();
if (ini_get("session.use_cookies")) { // !not sure what all this below does!
  $params = session_get_cookie_params();
  setcookie(session_name(), '', time() - 4200,
  $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
header('Location: http://.../index.php');
?>    

如何删除特定会话,即Portal?我在根域有另一个登录来访问报告,我不希望有权访问的用户都从两个会话中注销,而只是登录门户。

我的编码中是否有任何需要改进的内容可以改善/增强安全性?

谢谢!

2 个答案:

答案 0 :(得分:0)

您似乎没有任何服务器端验证。任何用户都可以在登录字段中插入他们想要的内容,然后访问“安全区域”,因为他们插入登录字段的任何内容都在会话中。如果您没有验证任何内容,我建议将登录信息放入数据库,当用户登录时,他们必须具有与数据库中的凭据相对应的匹配凭据。

另外,index.php页面的else {}面向错误的方向。这应该会出错。

<强>的index.php

<?php
session_start();

if(!isset($_SESSION['user']) || (trim($_SESSION['pass']) == '')) {
header("location: login.php");
exit();
} else {
  // show list of tools (secure area)
}

?>

答案 1 :(得分:0)

嗯,您的代码存在一些问题。

首先,您必须在{/ strong> session_name之前致电session_start (请参阅manual)。

此外,请勿在会话中提供敏感数据

session_set_cookie_params的文档中所述,您也可以之前致电session_start

session_set_cookie_params(3600, '/', '.yourdomain.com', false, true); // Notice the dot before the domain

这将允许您访问此域中所有应用程序中的会话。

我不知道你如何使用多个应用程序来完成这项工作,但如果他们支持单点登录,你就可以没有将密码放在那里。