【发布时间】:2017-12-01 18:46:49
【问题描述】:
我制作了一个自定义代码来保留该部分,我很快就在一个页面上,我返回到同一页面,会话保存并返回登录成功。
但当我要保存此页面上表单中的信息时,我会检查我是否已登录,并在失败时返回。
我还注意到,当我登录并通过导航菜单进入另一个检查登录的页面时,会话 tbm 不会保留。
有谁知道它可以是什么,或者你发现我在这些功能中缺少什么?
登录后保存表单信息的方法
<? php
include_once 'functions.php';
sec_session_start ();
$ error_msg = "";
$ page = "postar.php";
if (isset ($ _ POST [post]) && $ _POST [post] == "Upload") {
$ Image = "";
if (isset ($ _ FILES [btcapa]) &&! empty ($ _ FILES [btcapa] [name])) {
$ btimage = $ _FILES [btcapa];
switch ($ _ POST [sacervo]) {
case '1':
$ update = "img / comic";
break;
case '2':
$ update = "img / books";
break;
case '3':
$ updir = "img / files";
break;
}
$ Image = valida_upload ($ btimage, $ update);
if ($ Image [0] == '<') {
$ error_msg. = "<li> Document: not loaded." $ btimage [name]. "</ li>";
$ error_msg. = $ Image;
$ Image = '';
}
}
if (login_check ($ mysqli) == true) {
switch ($ _ POST [sacervo]) {
case '1':
$ error_msg. = valida_gibis ($ mysqli, $ Image);
break;
case '2':
$ error_msg. = validate_book ($ mysqli, $ Image);
break;
case '3':
$ error_msg. = validate_files ($ mysqli, $ Image);
break;
}
if ($ error_msg == '') {
if (! empty ($ Image)) {$ upload = move_uploaded_file ($ _ FILES [btcapa] [tmp_name], $ Image); }
$ msg_sucesso = "<li> Successfully inserted. </ li>";
header ('Location: ../'.$page.'?retorno='.$msg_sucesso);
} else {
header ('Location: ../'.$page.'?retorno='.$error_msg);
}
} else {
$ error_msg. = "<li> Could not insert, please log back in. </ li>";
header ('Location: ../postar.php?retorno='.$error_msg);
}
}
?>
个人登录功能
function sec_session_start() {
$session_name = 'SESSION'; // Estabeleça um nome personalizado para a sessão
$secure = SECURE;
// Isso impede que o JavaScript possa acessar a identificação da sessão.
$httponly = true;
// Assim você força a sessão a usar apenas cookies.
if (ini_set('session.use_only_cookies', 1) == FALSE) {
header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
exit();
}
// Obtém params de cookies atualizados.
$cookieParams = session_get_cookie_params();
session_set_cookie_params(time()+3600,
$cookieParams[path],
$cookieParams[domain],
$secure,
$httponly);
// Estabelece o nome fornecido acima como o nome da sessão.
session_name($session_name);
ob_start();
session_start(); // Inicia a sessão PHP
session_regenerate_id(); // Recupera a sessão e deleta a anterior.
setcookie(session_name(), '', time() + 3600, $params[path], $params[domain], $secure, $httponly);
}
检查是否已登录的功能
function login_check($mysqli) {
// Verifica se todas as variáveis das sessões foram definidas
if (isset($_SESSION[user_id], $_SESSION[username], $_SESSION[login_string])) {
$user_id = $_SESSION[user_id];
$login_string = $_SESSION[login_string];
$username = $_SESSION[username];
// Pega a string do usuário.
//$user_browser = $_SERVER[HTTP_USER_AGENT];
if ($stmt = $mysqli->prepare("SELECT usuarioSenha FROM usuario WHERE usuarioCod = ? LIMIT 1")) {
// Atribui "$user_id" ao parâmetro.
$stmt->bind_param('i', $user_id);
$stmt->execute(); // Execute the prepared query.
$stmt->store_result();
if ($stmt->num_rows == 1) {
// Caso o usuário exista, pega variáveis a partir do resultado.
$stmt->bind_result($password);
$stmt->fetch();
$login_check = $password;//hash('sha512', $password.$user_browser);
if ($login_check == $login_string) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
登录功能
function login($email, $password, $mysqli) {
// Usando definições pré-estabelecidas significa que a injeção de SQL (um tipo de ataque) não é possível.
if ($stmt = $mysqli->prepare("SELECT usuarioCod, usuarioNome, usuarioSenha
FROM usuario
WHERE usuarioEmail = ?
LIMIT 1")) {
$stmt->bind_param('s', $email); // Relaciona "$nusp" ao parâmetro.
$stmt->execute(); // Executa a tarefa estabelecida.
$stmt->store_result();
// obtém variáveis a partir dos resultados.
$stmt->bind_result($user_id, $user_name, $user_senha);
$stmt->fetch();
// faz o hash da senha com um salt excusivo.
//$password = hash('sha512', $password);
if ($stmt->num_rows == 1) {
if ($user_senha == $password) {
$_SESSION[user_id] = $user_id;
$_SESSION[username] = $user_name;
$_SESSION[login_string] = $user_senha;//hash('sha512', $password.$user_browser);
return '';
}
} else {
// Tal usuário não existe.
return '<p class="error"> Não existe esse usuario </p>';
}
}else {
return '<p class="error"> contate o adiministrador </p>';
}
}
【问题讨论】:
-
每一页都有
session_start()吗? -
是的,我在每个页面上都创建了一个“sec_session_star()”,该函数包含“session_start()”。如果我只尝试 'session_start()' 不起作用也无法登录。
-
在个人登录功能中,您启动了两次会话,这是为什么呢?
-
我从哪里开始两次?