joninho Posted July 3, 2006 at 10:59 PM Report #36050 Posted July 3, 2006 at 10:59 PM <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
brunogsimoes Posted July 30, 2007 at 09:21 PM Report #120895 Posted July 30, 2007 at 09:21 PM Há que ter em atenção o uso que é dado ao código pois pode apresentar graves falhas de segurança.
djthyrax Posted August 5, 2007 at 07:48 PM Report #122454 Posted August 5, 2007 at 07:48 PM 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!
brunogsimoes Posted August 6, 2007 at 02:30 PM Report #122683 Posted August 6, 2007 at 02:30 PM 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)
djthyrax Posted August 6, 2007 at 02:39 PM Report #122688 Posted August 6, 2007 at 02:39 PM 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!
brunogsimoes Posted August 7, 2007 at 10:09 AM Report #122882 Posted August 7, 2007 at 10:09 AM 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.
djthyrax Posted August 7, 2007 at 06:08 PM Report #123069 Posted August 7, 2007 at 06:08 PM 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!
brunogsimoes Posted August 13, 2007 at 10:59 AM Report #124468 Posted August 13, 2007 at 10:59 AM 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>')😛 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now