Jump to content

[PHP]GuestBook - Simples


joninho
 Share

Recommended Posts

<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

Link to comment
Share on other sites

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

Solução:

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

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

brunogsimoes

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)

Link to comment
Share on other 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...

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

brunogsimoes

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.

Link to comment
Share on other 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().

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

brunogsimoes

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.