• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hipnoted

Opiniões sobre código...

13 mensagens neste tópico

Boas,

Ando a fazer um simples e pequeno pequeno site sobre upload de ficheiros. E tenho uma parte onde o utilizador faz login.

Tou a usar sessões também. O que pretendia era eventuais opiniões sobre se há alguma quebra de segurança no código ou assim. O SQL Injection acho que já resolvi mas como ainda sou um bocado verde nisto...

<?php
// Receber os dados do utilizador
$login = $_POST['login'];
$senha = md5($_POST['senha']);

//Estabelecer uma ligação com a BD
//mysql_connect("Nome ou IP do servidor", "Utilizador", "Senha");
$conn = mysql_connect("localhost", "USER", "PASS") or die("Impossivel ligar à Base de Dados!");

if($conn)
{
	mysql_select_db("utilizadores", $conn);
}

//Criar o comando que efetua a pesquisa na BD
$sql = sprintf("SELECT id, nome FROM utilizadores WHERE login = '%s' AND senha = '%s'", 
	mysql_real_escape_string($login), mysql_real_escape_string($senha));

//Executar o comando
$rs = mysql_query($sql, $conn);

//Retorna o numero de linhas afectadas
$num = mysql_num_rows($rs);

//Verifica se alguma linha foi afectada, se foi retorna a sua informação
if($num > 0)
{
	//Retorna os dados da BD
	$rst = mysql_fetch_array($rs);
	$id = $rst["id"];
	$nome = $rst["nome"];

	//Inicia a sessão
	session_start();

	//Registra os dados do utilizador na sessão
	$_SESSION["id"]	= $id;
	$_SESSION["nome"] = $nome;
	$_SESSION["login"] = $login;

	//Encerra a ligação à BD
	mysql_close($conn);

	//Redirecciona para o index
	header("Location:uploadform.php");
}
else{
	//Encerra a ligação com a BD
	mysql_close($conn);

	//Caso nenhuma linha seja retornada emite o alerta
	echo "<br /><br /><br /><br /><center>Nenhum utilizador foi encontrado com esses dados...</center>";
	echo "<meta http-equiv='refresh' content='3;URL=login.php'>";
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo aí uma coisa mal, o header("Location:uploadform.php"); não tem o espaço a seguir ao Location: :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo aí uma coisa mal, o header("Location:uploadform.php"); não tem o espaço a seguir ao Location: :)

Mesmo assim isso funciona...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo aí uma coisa mal, o header("Location:uploadform.php"); não tem o espaço a seguir ao Location: :D

Mesmo assim isso funciona...

Sim, mas é "de convenção" pôr o espaço :)

Anyway, está aí um código 5 estrelas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só vejo aí uma coisa mal, o header("Location:uploadform.php"); não tem o espaço a seguir ao Location: :)

Mesmo assim isso funciona...

Sim, mas é "de convenção" pôr o espaço :)

Anyway, está aí um código 5 estrelas :)

Ah ok, as convenções foram feitas para serem cumpridas!  :D

Agora estou com um problema. Decidi meter uma imagem de background para que fique mais "amigável" ao utilizador. Mas dá um erro.

O meu ficheiro está estruturado da seguinte forma:

<style type="text/css">
<!--
body {
background-image: url(images/background.png);
}
-->
</style>

<?php
// código do post inicial
?>

Dá-me os seguinets erros:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Programas\VertrigoServ\www\up\auth.php:1) in C:\Programas\VertrigoServ\www\up\auth.php on line 40

Warning: Cannot modify header information - headers already sent by (output started at C:\Programas\VertrigoServ\www\up\auth.php:1) in C:\Programas\VertrigoServ\www\up\auth.php on line 51

De que será? Não posso meter imagens em background em ficheiros assim??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não podes fazer qualquer output antes do session_start();

Ou seja:

<?php session_start(); ?>
<!-- css -->
<?php /*resto do cod*/ ?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não podes fazer qualquer output antes do session_start();

Ou seja:

<?php session_start(); ?>
<!-- css -->
<?php /*resto do cod*/ ?>

Era isso mesmo. Obrigado!  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

if($conn)
{
mysql_select_db("utilizadores", $conn);
}

Isto é inutil basta colocares a seguir ao mysql_connect("localhost", "USER", "PASS"), nao precisas do if.

$sql = sprintf("SELECT id, nome FROM utilizadores WHERE login = '%s' AND senha = '%s'", 
mysql_real_escape_string($login), mysql_real_escape_string($senha));

Porque vais fazer um mysql_escape_string a um hash de md5? Nao te esquecas do que tinhas feito,

$login = $_POST['login']; 
$senha = md5($_POST['senha']);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

if($conn)
{
mysql_select_db("utilizadores", $conn);
}

Isto é inutil basta colocares a seguir ao mysql_connect("localhost", "USER", "PASS"), nao precisas do if.

Esse if estava num tutorial de net pelo qual me guiei.

$sql = sprintf("SELECT id, nome FROM utilizadores WHERE login = '%s' AND senha = '%s'", 
mysql_real_escape_string($login), mysql_real_escape_string($senha));

Porque vais fazer um mysql_escape_string a um hash de md5? Nao te esquecas do que tinhas feito,

$login = $_POST['login']; 
$senha = md5($_POST['senha']);

Quer dizer então que só preciso de passar pelo mysql_escape_string o login? É também vi tutoriais pela net a fazerem isso... :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim porque depois de fazeres o md5 vais ficar com algo tipo: dsvs65d876dv7s8d6v986sv68v6dsvsd87v6 ou seja ninguem vai te fazer mysql_injection atraves do md5...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As convenções não foram feitas para ser cumpridas... Foram feitas para criar um tipo de standard entre programadores, no caso de partilha de código é muito mais fácil perceber-se o código se todos usarem as mesmas convenções, mas podes muito bem criar tu as tuas próprias convenções ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As convenções não foram feitas para ser cumpridas... Foram feitas para criar um tipo de standard entre programadores, no caso de partilha de código é muito mais fácil perceber-se o código se todos usarem as mesmas convenções, mas podes muito bem criar tu as tuas próprias convenções :P

e sres o bill gates do PHP, tds percebem mas ninguem curte XD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora