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

joninho

[PHP]GuestBook - Simples

8 mensagens neste tópico

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Mensagens - GuestBook</title>
<style type="text/css">
<!--
body {	
background-color: #156564;
background-image: url(lol9.jpg);
}
.style2 {
color: #0099FF;
font-size: 18px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.style1{
color:#000000;
font-size:18px;
font-family:Geneva, Arial, Helvetica, sans-serif
}
-->
</style>
<body> 
</head>
<table width="499" border="1" bordercolor="#CC3300" cellpadding="0" cellspacing="0" align="center">
  <!--DWLayoutTable-->    <tr>   
<td width="495" height="185" valign="top" bgcolor="#CCCCCC">
<?php
/* Ligacao a base de dados, substituir:SERVER: pelo vosso servidorUSER: pelo vosso user da base de dadosPASS: pela vossa password da base de dadosBASE_DE_DADOS: pela vossa Base de dados */ 
$dbh=mysql_connect ("SERVER", "USER", "PASS") or die ('Não é possivel aceder à base de dados porque: ' . mysql_error());mysql_select_db ("BASE_DE_DADOS");

// aqui a variavel $var vai receber um valor introduzido no endereço por exemplo index.php?action=lol a variavel $var vai ficar com o conteudo "lol", que é para depois usar os cases em vês de 2 páginas, como é cases e a variavel var logo no principio tem o conteudo "" e nao tenho nenhuma case para esse conteudo irá ser redireccionado para o default.

$var=$_GET["action"];
//abrir os cases
switch($var){
//case Enviar
case "enviar":
//bem vindo ao case enviar XD lol aqui é onde vai receber o conteudo do formulario para enviar para a base de dados...
//a variavel date vai ficar com a data de hoje, e esta a função.
$date = date("j/n/Y");
//a variavel nome vai receber o conteudo do formulario onde voce inseriu o nome..
$nome = $_POST["nome"];
//a variavel mensagem vai receber o conteudo do formulario onde voce interiu a mensagem, o nl2br é para fazer paragrafos ao longo do texto, respectivamente pelos paragrafos k meter..
$mensagem = nl2br($_POST["mensagem"]);
//query para inserir o conteudo das variaveis na base de dados
$query= "INSERT INTO `Guestbook` (`de` , `mensagem`, `date` ) VALUES ('$nome', '$mensagem',''$date')";
//se a query for bem sucedida entao apresenta o texto: "mensagem enviada" e uma hiperligação para voltar ao index.php
if(mysql_query($query)){
echo "mensagem enviada!!!<br>";
echo '<a href=index.php>Voltar</a>';
//senao apresenta o texto: "mensagem nao foi enviada ocorreu um erro..." e uma hiperligacao para voltar ao index.php
}else{
echo "mensagem nao foi enviada ocorreu um erro...<br>";
echo '<a href=index.php>Voltar</a>';} 
//fexar o case ESTA ACABADO O SCRIPT DO GUESTBOOK 
break; 


//entao, o primeiro passo que a pagina faz é entrar aqui. e fazer o que o script manda... 
default: 
//aqui fazemos uma query para  bd, que vai seleccionar o conteudo da tabela Guestbook
$query="SELECT * FROM `Guestbook` WHERE 1";
//fazemos a query para dentro da variavel $nome, que vai ficar uma array. os nomes das variaveis podem ser alterados por si, desde que use direito e mude em todo lado..
$nome=mysql_query($query); 
/* agora fazemos um ciclo para imprimir no ecrã tudo o que tiver a array $nome tiver, nao sei bem explicar o ciclo XD mas sei que é para isso.ou seja imprime o que tiver na tabela, menos o id, se quiser tb pode imprimir o id, basta meter um echo $titulo[1], dependendo da posição desse campo...*/

 		while($titulo = mysql_fetch_row($nome)){
                                                                //imprime o remetente da mensagem...
			echo '<br><span class="style2">De: </span>'.'<span class="style1">'.$titulo[1].'</span>';
                                                                //imprime a data do local..
		echo '<br><span class="style2">Data: </span>'.'<span class="style1">'.$titulo[4]."</span><br>";
                                                               //e por fim imprime a mensagem
		echo '<br><span class="style2">Mensagem: </span><br>'.'<span class="style1">'.$titulo[2].'</span><br>';
                       //separador das mensagens... fica mais bonito, assim pode separar umas das outras..
		echo "==================================================================================";
// fexar o ciclo

}  

//aqui fica o formulario para inserir na base de dados 
?>
//action e para onde o form vai mandar os dados, neste caso vai mandar para a nossa case enviar, porque vai meter o conteudo enviar na variavel e entao vai entrar na case "enviar" precebido? 
<form action="index.php?action=enviar" method="post"> Nome:  <br />
//aqui e a insercao do nome
    <input type="text" name="nome"/>  <br />    Mensagem:  <br />
// agora a da mensagem
    <textarea name="mensagem" cols = "70" rows="8"></textarea><br />
//estes sao os botoes submit para submeter o formulario e o reset para limpar tudo
<input type="submit" value="Enviar"/>	
<input type="reset" value="Limpar tudo"/>  
//fexar o formulario
</form>
<?
//e fexar o case default, agora faz de conta que uma pessoa mete texto no formulario, entao o script vai saltar para o case "enviar". dirija-se agora ao case"enviar"
break;
}
?>
</td>
  </tr>
</table>
</body>
</html>
<?php
//fexa a ligacao a base de dadosmysql_close($dbh); ?>

podem ver o resultado  aqui

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há que ter em atenção o uso que é dado ao código pois pode apresentar graves falhas de segurança.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, e a vulnerabilidade está aqui: $nome = $_POST["nome"];

Solução:

$nome = mysql_real_escape_string($_POST["nome"]);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, e a vulnerabilidade está aqui: $nome = $_POST["nome"];

Solução:

$nome = mysql_real_escape_string($_POST["nome"]);

como o djthyrax referiu e bem o uso da função resolve alguns problemas do SQLi, contudo ainda persistem muitos outros problemas.

Para resolver grande parte deles é aconselhado retirares qualquer tipo de tags como <!-- .... >, tags para imagens em HTML e dar muita atenção ao JAVASCRIPT (que recomendo retirares tambem)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, e a vulnerabilidade está aqui: $nome = $_POST["nome"];

Solução:

$nome = mysql_real_escape_string($_POST["nome"]);

como o djthyrax referiu e bem o uso da função resolve alguns problemas do SQLi, contudo ainda persistem muitos outros problemas.

Para resolver grande parte deles é aconselhado retirares qualquer tipo de tags como <!-- .... >, tags para imagens em HTML e dar muita atenção ao JAVASCRIPT (que recomendo retirares tambem)

$stuff = str_replace(array("<", ">"),array("<", ">"), $stuff); ou então $stuff = htmlentities($stuff); ou $stuff = strip_tags($stuff);

Há tantas possibilidades...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código que se segue resolve a maioria dos problemas não SQL.

function clean($data){
	$stripAttrib = array(
		'@<[\/\!]*?[^<>]*?>@si',
		'@<![\s\S]*?--[ \t\n\r]*>@',
		'@(javascript:)|((on[a-z]+)\s*=[^>]+?)@'
	);
	return preg_replace($stripAttrib, '', $data);
}

Por isso deve ser usado em conjunto com a função já referida pelo djthyrax.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código que se segue resolve a maioria dos problemas não SQL.

function clean($data){
				 /* Javascript */
$stripAttrib= array('@<script[^>]*?>.*?</script>@si',             
				/* HTML */
				'@<[\/\!]*?[^<>]*?>@si',    
				/* STYLE */
				'@<style[^>]*?>.*?</style>@siU',
				/* CDATA */     
				'@<![\s\S]*?--[ \t\n\r]*>@',
				/* Javascript */
				'(javascript:)|((on[a-z]+)\s*=[^>]+?)'
);
return str_replace ("/$stripAttrib/i", '', $data);
}

Por isso deve ser usado em conjunto com a função já referida pelo djthyrax.

Faz o mesmo que o strip_tags().
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa djthyrax, não tinha lido como deve de ser a tua resposta #4 (o que fazia com que a #5 fosse totalmente escusada).

O uso do strip_tags é boa ideia, podes inclusive permitir alguns tags (exemplo: strip_tags($data, '<b><i><u>'):P

Agora relativamente ao meu post #5, existiam alguns problemas (já alterados em cima do joelho):

1) Tinha erros ortográficos

2) Era redundante

3) Não funcionava - ponto critico

4) O strip_tags() soluciona o problema com a mesma abordagem (contudo não fazia o mesmo que o strip_tags() - já foi dito em parte porquê).

Cumps

BS

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