首先,關於該項目的PHP會話不被想起
這個問題在一個網站我在PHP開發發生的一些信息。我們決定使用一個不同的子域對於我們JSON API,因爲這樣的:
子域,我們在:tickets.example.com JSON的位置:api.example.com/json
爲了登錄我們正在開發的票據系統,我們發送一個獲取請求到一個php腳本,它將結果作爲json字符串返回。
問題
看來,PHP不能看到我們有媒體鏈接創建一個會話,當我們發送給我們的登錄腳本的請求。雖然我們已經有一個PHPSESSID Cookie設置,但由於某種原因,我在響應頭文件中獲得了一個新的會話ID。
你可以說:「嘿,不同的子域名,當然這不起作用!」
我就想到這裏我自己,而是使用一個Cookie編輯器會話ID更改爲組中的一個-cookie頭的響應登錄我進去。
數據流量
對於缺乏更好的名稱
步驟1:請求是通過jQuery sendt,像這樣:
$('#loginForm').submit(function(e) {
e.preventDefault();
$.post('http://api.website.com/json/login.php', $('#loginForm').serialize(), function(data) {
if(data.result==true)
{
location.reload();
}
else
{
error(data.message);
}
},
'json'
);
});
正如你所看到的,如果我們在json文件中得到result = true,那麼網站應該重新加載(並顯示登錄的網站)。發生這種情況,但由於會話處理有問題,我們被設置爲在另一個會話ID中「登錄」。
這是請求sendt和響應頭:
image http://puu.sh/anKCX/75701a8891.png
正如你所看到的,我們得到一個Set-Cookie頭,告訴我們到cookie PHPSESSID設置的東西。這從來沒有實際完成,並且Cookie保持與登錄前相同(r71qijt6utua4qjgarm59oe535)
如我所述,將cookie更改爲我們的新會話ID將使我們進入。
代碼
下面是一些片段:
的login.php
<?php
require_once 'utils.php'; //Runs session_start();
[...]
if (!Utils::isAuthenticated()) {
if (isset($_POST['username']) &&
isset($_POST['password']) &&
!empty($_POST['username']) &&
!empty($_POST['password'])) {
$username = $_POST['username'];
$password = hash('sha256', $_POST['password']);
if (UserHandler::userExists($username)) {
$user = UserHandler::getUserByName($username);
$storedPassword = $user->getPassword();
if ($password == $storedPassword) {
$_SESSION['user'] = $user;
[...]
你叫'session_start'嗎? –
是的,在utils.php。這是require_once'd無處不在,所以不應該是一個問題 –