← PHP

[Dúvida] Desenvolvimento de Plataforma parecida a blog

Lida 13916 vezes

Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Já "demos" a matéria temos que fazer o projecto xD
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Não faz muito sentido armazenar a password na $_SESSION.

Se fosse eu, metia o session_start no functions .php e fazia o include do functions.php logo na primeira linha de todos os ficheiros.

Depois metes isto tudo dentro do header.php:

Código: (php) [Seleccione]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="css/reset.css">
<link rel="stylesheet" type="text/css" href="css/text.css">
<link rel="stylesheet" type="text/css" href="css/style.css">

<title></title>
</head>
<body>

<header>

<a href="#"><h1></h1></a>

<nav>

<?php
if ((!isset ($_SESSION["utilizador"])) AND (!isset($_SESSION["senha"]))) {
echo '<a href="index.php">Home</a>';
echo '<a href="index.php">Notícias</a>';
echo '<a href="index.php">Login</a>';
echo '<a href="index.php">Register</a>';
echo '<a href="index.php">About us</a>';
echo '<a href="index.php">Contact us</a>';
}
else {
echo '<a href="index.php">Home</a>';
echo '<a href="index.php">Notícias</a>';
echo '<a href="index.php">Inserir Notícia</a>';
echo '<a href="index.php">Categoria</a>';
echo '<a href="index.php">About us</a>';
echo '<a href="index.php">Contact us</a>';
}
?>


</nav>


</header>


O ficheiro index.php ficaria assim:

Código: (php) [Seleccione]
<?php
require_once('functions.php');
getHeader();
?>

<div class="wrap">
CONTEUDO
</div>
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Ou seja no ficheiro functions.php começaria logo com:

Código: [Seleccione]
<?php

session_start 
();

?>

E depois em todos os outros era só fazer o require ou include logo do ficheiro functions certo?

EDIT: Disseste que não fazia muito sentido incluir a password no session_start, mas porquê basta utilizar o utilizador?
Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Podes incluir a password nas variáveis session, mas no mínimo encriptas as strings:

<?php
$senha = $_POST['senha'];
$senhasegura = md5($senha);
?>

Isto é o básico, mas o básico acaba por ser inseguro. Muita gente diz que MD5 não é seguro e na realidade não é se utilizares o que escrevi acima.
Para tornares a encriptação mais segura, pede aos teus usuários para utilizarem letras (mínimo 6), números (mínimo 3) e um caracter do tipo: @€#%&"!/(#/
Repara que mesmo o MD5 não sendo à prova de colisão (Vai ler um pouco sobre isto), com tanto caracter manhoso é difícil reverteres o que está encriptado.
Para poupares trabalho aos teus visitantes, podes ainda tu mesmo aplicar a técnica de SALT, funciona muitíssimo bem mesmo com MD5, ou então opta por outras formas de encriptação.

Podes ainda em vez de utilizares a password nas variáveis session, utilizar um token. Eu costumo fazer assim.

Nunca se sabe onde podes ter uma vulnerabilidade XSS e roubar os cookies é um mimo. 
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

hehehe realmente sim devíamos usar encriptação, mas penso que isso seja possível de se fazer no fim se houver tempo, agora o mais importante é rapidamente ter isto a funcionar de novo, porque o projecto encontra-se a funcionar mas muito rudimentar e um pouco fora do contexto do que era para ser inicialmente, agora estamos a refazer tudo de novo e conforme vamos tendo ideias novas vamos apontando para implementar no fim se possível.

Assim que acabar a parte das funções e re-estruturação do código e layout, espero conseguir começar a dar esses tais retoques, embora ainda tenha que voltar a mexer na base de dados :x
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

hehehe realmente sim devíamos usar encriptação, mas penso que isso seja possível de se fazer no fim se houver tempo, agora o mais importante é rapidamente ter isto a funcionar de novo, porque o projecto encontra-se a funcionar mas muito rudimentar e um pouco fora do contexto do que era para ser inicialmente, agora estamos a refazer tudo de novo e conforme vamos tendo ideias novas vamos apontando para implementar no fim se possível.

Assim que acabar a parte das funções e re-estruturação do código e layout, espero conseguir começar a dar esses tais retoques, embora ainda tenha que voltar a mexer na base de dados :x

Não sei como funciona o teu sistema de login, mas parto do princípio que se existe SESSION é porque o user acertou na password, logo, para quê armazena-la? Vais usá-la para alguma coisa?

Eu no $_SESSION só costumo armazenar o id e um ou outro dado que se use muitas vezes. Se pontualmente for necessário mais alguma coisa, faz-se um query à BD.
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Pois tenho de ver isso, porque aqui isto só é usado para verificar se o login está efectuado, como disse anteriormente, a professora que deu esta matéria deu-a de uma forma um pouco ao espeta com powerpoints cheios de linha de código no quadro e falava durante uma hora ou duas a explicar meia dúzia das linhas que lá estavam e mesmo assim era explicações do género para fazer login à bd usam estas 3 linhas com os vossos dados aqui... o que não dá jeito nenhum quando estamos a aprender alguma coisa nova :x

Mas vou ver isso e talvez faça como tu com o ID ou username apenas, uma vez que é só para passar a sessão dum lado para o outro...

Uma dúvida alguém me sabe dizer a melhor forma de depois de carregar uma determinada página, ser efectuado um redireccionamento, mas com um delay de 2 ou 3 segundos para dar tempo ao utilizador de ver a página?

Para fazer o redireccionamento estou a usar:
Código: [Seleccione]
<script>location = "index.php";</script>
Mas assim ele faz logo e tanto pode dar tempo de ver a página como não dar tempo nenhum xD
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Pois tenho de ver isso, porque aqui isto só é usado para verificar se o login está efectuado, como disse anteriormente, a professora que deu esta matéria deu-a de uma forma um pouco ao espeta com powerpoints cheios de linha de código no quadro e falava durante uma hora ou duas a explicar meia dúzia das linhas que lá estavam e mesmo assim era explicações do género para fazer login à bd usam estas 3 linhas com os vossos dados aqui... o que não dá jeito nenhum quando estamos a aprender alguma coisa nova :x

Mas vou ver isso e talvez faça como tu com o ID ou username apenas, uma vez que é só para passar a sessão dum lado para o outro...

Uma dúvida alguém me sabe dizer a melhor forma de depois de carregar uma determinada página, ser efectuado um redireccionamento, mas com um delay de 2 ou 3 segundos para dar tempo ao utilizador de ver a página?

Para fazer o redireccionamento estou a usar:
Código: [Seleccione]
<script>location = "index.php";</script>
Mas assim ele faz logo e tanto pode dar tempo de ver a página como não dar tempo nenhum xD

Se é só para isso então não faz sentido nenhum. Se existe $_SESSION['username'] então o outro tem que existir também. Além de ser uma falha grave de segurança, é uma redundância desnecessária.

Para que queres esse redirect? Para fazer um login ao estilo dos fóruns ("Login com sucesso. Daqui a 3 segundos será redirecionado")?
A meu ver isso não é muito user-friendly, mais vale passar directamente para a página final, mas podes tentar isto:

Código: (javascript) [Seleccione]
<script type="text/JavaScript">
<!--
setTimeout("location.href = 'http://www.pagina.com';",3000);
-->
</script>

O 3000 é em milissegundos, portanto, 3 segundos.


EDIT: Isso das bases de dados é normal, são funções muito específicas que não têm muito que saber, é mesmo usar os dados correctos.
O importante é SQL, para saber construir querys e, se criares bases de dados, ter conhecimentos mínimos de análise de sistemas e normalização.
Offline

cpdesign 
Membro
Mensagens 235 Gostos 1
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Atenção não guardar dados sensíveis como a password em variáveis de sessão, isso abre uma vulnerabilidade enorme no código.

Percebo que para efeitos de ensino/aprendizagem funcione bem, mas no mundo real não deves usar essa abordagem.
Não coloques lá o password, codificada ou não, mas sim um valor de controlo codificado, que possas verificar a qualquer momento a sua veracidade.
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Sim a password é para retirar dali :) a professora por acaso não explicou isso, nem sequer falou de como encriptar as passwords :x mas assim que possível vou tratar disso ^^
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Sim a password é para retirar dali :) a professora por acaso não explicou isso, nem sequer falou de como encriptar as passwords :x mas assim que possível vou tratar disso ^^

Não precisas de encriptar nada, simplesmente remove-a da sessão e na parte do if fazes só (!isset$_SESSION['username']).
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Código: (php) [Seleccione]
function login($username, $password) {
$conn = bdConnect();

$username = $_POST['login-username'];
$password = $_POST['login-password'];

$query = "SELECT * FROM login WHERE log_user='$username' AND log_pass='$password'";
$sid = oci_parse($conn, $query);
$resultado = oci_execute($sid);
$dbarray = oci_fetch_array($sid);

if ($dbarray["LOG_USER"] != $username) {
echo '<p>Nome de utilizador Inválido</p>';
exit;
}
if ($dbarray["LOG_PASS"] != $password) {
echo '<p>Password Inválido</p>';
exit;
}
else {
session_start();
$_SESSION["utilizador"] = $username;
$_SESSION["senha"] = $password;
}
}

Então aqui tiro no fim a parte da password e depois é só remover dos ifs?
Eu acho que a forma como tenho precisa disso para comprar com a BD ou por outro lado ali no fim já não tá a fazer nada porque está só a passar isso no session_start() certo? logo posso remover e passa a passar apenas o username.
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Sim, fica assim:

Código: (php) [Seleccione]
function login($username, $password) {
$conn = bdConnect();
 
$username = $_POST['login-username'];
$password = $_POST['login-password'];
 
$query = "SELECT * FROM login WHERE log_user='$username' AND log_pass='$password'";
$sid = oci_parse($conn, $query);
$resultado = oci_execute($sid);
$dbarray = oci_fetch_array($sid);
 
if ($dbarray["LOG_USER"] != $username) {
echo '<p>Nome de utilizador Inválido</p>';
exit;
}
if ($dbarray["LOG_PASS"] != $password) {
echo '<p>Password Inválido</p>';
exit;
}
else {
session_start();
$_SESSION["utilizador"] = $username;
}
}

Nunca usei Oracle com PHP (e é muito estranho usarem isso na escola), mas essa query é facilmente injectável (SQL Injection).
Nunca se introduz dados que vêm do utilizador directamente numa query.

Com MySQL safavas-te com um real escape string, ou com PDO e prepared statements, com oracle não sei, mas nada que uma pesquisa não resolva.
Offline

Tekku 
Membro
Mensagens 100 Gostos 3
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Aquilo é na Instituto Politécnico de Setúbal, estamos a ter a mesma matérias que o pessoal de Engenharia Informática dá nestas disciplinas lá no primeiro ano, até porque os stores são os mesmos... Também não te sei dizer o o porquê do Oracle, foi a primeira vez que mexi em Oracle xD Ainda tenho alguma esperança que mais para a frente apareça uma disciplina qualquer a falar destas questões da segurança, mas já tou a ver o cet quase a acabar e ainda nada :x
Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Não precisas de encriptar nada, simplesmente remove-a da sessão e na parte do if fazes só (!isset$_SESSION['username']).

Se estiver devidamente encriptada, é tão seguro como usares o ID como já sugeriste. Descriptar uma password encriptada com SHA-2 é virtualmente impossível... De qualquer forma também acho desnecessário teres lá a pass a não ser que precises mesmo...

Acho que as duas formas não são as mais seguras, como disse é preferível criar um token... É o que eu faço...

Mesmo que não utilizes as passwords nas variáveis sessions, acho muito mau fazeres o que o RuiGomes disse, não encriptar é um erro. Se a base de dados for comprometida perdes dados vitais.