浏览器会话是否对每个子域都是唯一的?

时间:2016-09-14 17:37:14

标签: ruby-on-rails session cookies

假设我正在运行一个多租户应用程序,它通过子域为每个组织提供自己的门户。

示例 -

  • orgA.application.com
  • orgB.application.com
  • 等...

每个子域都从我的PSQL数据库中的不同架构/租户读取,但在其他方面是相同的应用程序。

在我的ApplicationController我将current_user设为 -

def current_user
  if session[:user_id]
    @current_user ||= User.find_by_id(session[:user_id])
  end
end

很少有像我这样的管理员/超级用户在每个子域上都有一个用户帐户。如果我与我的用户(orgA)登录id = 22,那么我的session设置为user_id: 22

现在说我要切换到orgB,我的用户ID为44。如果我在orgB中设置会话后登录orgA,我是否有可能在22 orgB上以current_user为用户意外登录?

更重要的是,我正在尝试了解如何设置浏览器cookie会话。根据我的理解,它是在客户端浏览器中加密和缓存的变量哈希值。是每个子域设置的吗?或者特定站点的所有子域共享相同的缓存/会话cookie?

更重要的是,如何阻止会话的异花授粉,如上例所示?我的<?php // connect to the database include('connect-db.php'); // number of results to show per page $per_page = 5; // figure out the total pages in the database if ($result = $mysqli->query("SELECT * FROM players ORDER BY id")) { if ($result->num_rows != 0) { $total_results = $result->num_rows; // ceil() returns the next highest integer value by rounding up value if necessary $total_pages = ceil($total_results / $per_page); // check if the 'page' variable is set in the URL (ex: view-paginated.php?page=1) if (isset($_GET['page']) && is_numeric($_GET['page'])) { $show_page = $_GET['page']; // make sure the $show_page value is valid if ($show_page > 0 && $show_page <= $total_pages) { $start = ($show_page -1) * $per_page; $end = $start + $per_page; } else { // error - show first set of results $start = 0; $end = $per_page; } } else { // if page isn't set, show first set of results $start = 0; $end = $per_page; } // display pagination echo "<p><a href='view.php'>View All</a> | <b>View Page:</b> "; for ($i = 1; $i <= $total_pages; $i++) { if (isset($_GET['page']) && $_GET['page'] == $i) { echo $i . " "; } else { echo "<a href='view-paginated.php?page=$i'>$i</a> "; } } echo "</p>"; // display data in table echo "<table border='1' cellpadding='10'>"; echo "<tr> <th>ID</th> <th>First Name</th> <th>Last Name</th> <th></th> <th></th></tr>"; // loop through results of database query, displaying them in the table for ($i = $start; $i < $end; $i++) { // make sure that PHP doesn't try to show results that don't exist if ($i == $total_results) { break; } // find specific row $result->data_seek($i); $row = $result->fetch_row(); // echo out the contents of each row into a table echo "<tr>"; echo '<td>' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; echo '<td>' . $row[2] . '</td>'; echo '<td><a href="records.php?id=' . $row[0] . '">Edit</a></td>'; echo '<td><a href="delete.php?id=' . $row[0] . '">Delete</a></td>'; echo "</tr>"; } // close table> echo "</table>"; } else { echo "No results to display!"; } } // error with the query else { echo "Error: " . $mysqli->error; } // close database connection $mysqli->close(); ?> 方法太基础了吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

你从根本上询问这里的cookie,答案相对简单:除非你明确要求,否则cookie不会在子域之间共享

当您发送Set-Cookie HTTP标头以在用户的​​浏览器中创建Cookie时,您可以选择是否包含domain配置选项。该选项控制cookie保存在哪个域并将被提供给。

默认情况下,如果您发送的Set-Cookie没有domain选项,则会为当前主机名设置,其中包含子域。也就是说,siteA.example.com无法访问siteB.example.com上设置的Cookie。

如果您在domain上创建Cookie时发送example.com siteA.example.comexample.com选项,则可以*.example.comSet-Cookie访问该Cookie ,因此您的所有网站都可以访问它。

对于您的情况,您应该使用 domain选项发送A标头。这是大多数设置中的默认设置including Rails,因此您不太可能需要做任何事情。