Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

halsm

Dados gravados aparecem em Branco

Recommended Posts

Bom dia pessoal,Tenho um formulário de contato que na action chama um scrip PHP, p/ inserir os dados em minha tabela.quando envio o formulário, e vou conferir se gravou na Tabela, os dados aparecem todos em branco. Apenas a chava primária vai contando...Alguém tem alguma idéia do que possa estar acontecendo?segue código:<?include "conexao.php";$sql="INSERT INTO tb_contato(nome,email,telefone,mensagem) VALUES ('$nome','$email','$telefone','$mensagem')";mysql_query($sql,$con) or die ('Não foi possivel enviar contato, tente novamente');header("Location: contato_ok.php");?>valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

se for via form você tem que pegar as variaveis assim:$nome = $_POST['nome'];$email = $_POST['email'];$telefone = $_POST['telefone'];$mensagem = $_POST['mensagem'];posta aí se não for isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

foreach ($_POST as $campo => $valor) { $$campo = trim($valor);}

Cara, isso dá problema de segurança. Se alguém mal intencionado quiser, poderá mexer com suas variáveis desta forma.As versões novas do php vem com o registerGlobals = false justamente pra evitar este problema de segurança. (obs. O register globals faz a mesma coisa que se código acima (acho).Acho que a melhor e mais segura solução é a do andre gil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

micox nada haver o que você falou, onde da problema em segurança?

 

pesquise primeiro antes de falar e tente entender cada função e pra que ela serve se nao você fica viajando

 

register_globals = on pega as variaveis diretamente sem usar $_POST ou $_GET

 

só pense melhor antes de falar as coisas porque nessa você falou besteira

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae pessoal valeu mesmo.Consegui passar as variáveis com o código do André Gil!Ow Fabyo, então se eu deixar register_globals = on, entaum não preciso do código do André p/ passar as variáveis por Form? é isso ?Pq eu já usei esse meu códigoem outro site e funcionou beleza sem ter que pegaras variáveis....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo, se acalme cara. Ce tá muito nervoso...Todos erram, eu também (por isso escreví a palavra 'acho' 2 vezes, pois não tinha certeza).Todos estamos aprendendo, ninguém é dono da verdade.Ah. e estude um pouco sobre segurança tambémBom... Agora que já nos acalmamos, vamos às explicações.Imaginem voces que um programador qualquer tenha o seguinte código (é só uma suposição explicativa pra voces entenderem):

$varpath="../db/variaveis.php";...// um monte de códigoforeach ($_POST as $campo => $valor) { $$campo = trim($valor);}...//um monte de códigoinclude $varpath;
Daí, em um belo dia, quando o webmaster menos espera, vem um espertinho e acessa a seguinte página:
www.suapagina.com/seuscript.php?varpath=?varpath=../outrocaminho/outrasvars.php
(É claro que convertido para o formato UTF-8 que é o formato querystring. To com preguiça de converter. hehe)Pergunto: O que acontecerá com o include????Eu IMAGINO que acontecerá bobeira. (veja bem, escreví imagino porque não tenho certeza pois não testei).A variável varpath pegará o valor que o cara digitou no browser e não mais o valor que o programador digitou. Como acontece no register_globals.

só pense melhor antes de falar as coisas porque nessa você falou besteira

Ah. se realmente eu estiver errado e tiver falado bobeira, peço que EDUCADAMENTE me corrijam em minha ignorância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo GET é uma coisa POST, mas desculpe se pareci grosso me expressei mal

 

e outra coisa o que você tentou montar ai nao tem nada haver mesmo

 

www.suapagina.com/seuscript.php?varpath=?varpath=../outrocaminho/outrasvars.php

 

que caminho é esse que você imagina existir ?, se nao vai conseguir invadir o servidor e colocar um script muito menos

passar get por post

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas desculpe se pareci grosso me expressei mal

OK. Diboas...

amigo GET é uma coisa POST

.Mas o malando ainda poderia fazer uma págininha simples qualquer:
<form action="http://www.suapagina.com/seuscript.php" method="post"><input type="text" name="varpath" value="../outrocaminho/outrasvars.php"></form>
Obs.: Não estou falando em invadir servidor. Estou falando em segurança de aplicações (no caso aplicações PHP).O exemplo que eu utilizei é só para ilustrar como um atacante (ou um usuário inadvertidamente) pode ter acesso as variáveis do programador, modificando da forma que ele quiser. É um exemplo um pouco irreal sim, mas já dá pra ter idéia.Eu por exemplo já tive problemas com a famosa variável '$i' (muito usada em contadores. hehe)...Quando eu falo em segurança, não falo apenas em proteger de hackers, mas também proteger o código de fluxos não previstos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece sim.

 

Tanto que acho que os caras tiraram o register_globals do default por causa disso. Dá uma lida lá no php.net..

 

Ah. acabei de acessar http://br2.php.net/register_globals e lá eles tem um exemplo muito melhor e mais simples que o meu explicando o assunto. :)

Inclusive ensinando como se proteger do 'Envenenamento de variáveis' (acho que a tradução é essa. hehe)

Compartilhar este post


Link para o post
Compartilhar em outros sites

micox nao tem como a pessoa se aproveitar dessa função porque

na função que ira usa-la somente ira funcionar as variaveis que o usuario determinou exemplo:

 

$sql="INSERT INTO tb_contato(nome,email,telefone,mensagem) VALUES ('$nome','$email','$telefone','$mensagem')";

 

dai o que você imaginar fazer nao tem diferença nenhuma em usar

 

 

 

$nome = $_POST['nome'];

$email = $_POST['email'];

$telefone = $_POST['telefone'];

$mensagem = $_POST['mensagem'];

 

e essa:

foreach ($_POST as $campo => $valor) { $$campo = $valor;}

 

as variaveis serao as mesmas, e se algum usuario tentar mandar algum outro valor tera o mesmo efeito independende da função

 

e usando foreach é muito mais pratico imagina ter que digitar 30 campos um por um

 

nao tem falha de segurança nenhum nisso, o nivel de segurança é igual

usando foreach pegando o POST como usar $_POST direto

 

e se for algo que precise de mais segurança só melhorar a segurança mas nao precisa deixar de usar o foreach ali que esta bem aplicado

 

micox só nao confunda registar_globals = on com a função foreach do topico a função foreach ta segura e é usada com register_globals = off

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, no meu entendimento, a única diferença entre esta função e o register_globals=on é que o register_globals pega GET também.

Porém como eu já expliquei acima, isto não é um impecilho pra alguém mal intencionado.

 

Quando falamos que uma função ou recurso é inseguro (no âmbito de segurança de programação), não quer dizer que ele SEMPRE será inseguro.

 

No caso do colega, a função não será insegura pois não há códigos entre a função e a SQL, porém caso o colega se animasse com a função e quisesse utilizá-la em outro âmbito (como no exemplo explicado pelo php.net)? Os problemas iriam aparecer.

 

Porém ela PODERÁ vir a se tornar insegura caso ele a utilize da seguinte forma:

<?include "conexao.php";foreach ($_POST as $campo => $valor) { $$campo = trim($valor);}$sql="INSERT INTO tb_contato(nome,email,telefone,mensagem) VALUES ('$nome','$email','$telefone','$mensagem')";mysql_query($sql,$con) or die ('Não foi possivel enviar contato, tente novamente');header("Location: contato_ok.php");?>
Perceba que a função está entre o include e a sql. Desta forma algumas variáveis que eram definidas na include PODERÃO ser alteradas por algum malandro.

 

 

Por isso o pessoal RECOMENDA não utilizar funções inseguras, pois não se sabe se o programador vai manezar e utilizar a função/recurso de forma incauta ou de forma segura.

 

Há várias formas de se utilizar funções inseguras de forma segura. Em um exemplo de formulário, o cara poderia usar sessions por exemplo para impedir malandragens.

Porém não é todo programador que fica atento pra falhas em potencial (em potencial)...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu também uso o foreach pra $_POST e continuarei usando.

Mas o Micox está certo ! Alguma besteira poderia ser feita em alguma ocasião !

Claro que seria difícil, porque ele teria que saber se o include será feito diretamente com o nome do arquivo assim:

include("inc/conexao.php"); // sem problemas
ou com uma variável que armazenaria o Path, assim:

$path_BD = "inc/conexao.php";include($path_BD); // agora sim poderia ter problemas
E outra coisa, o Hacker teria que saber o nome da variável usada no include, que no caso se chama $path_BD para poder substituí-la;

 

Se eu tiver errado me corrijam !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

micox continua falando besteira nada haver mesmo, se ta confundindo as coisas register_globals é uma coisa e usar a função foreach é a mesma coisa que usa $_POST

 

cara é questao de saber usar e ser pratico programação é isso saber fazer as coisas e forma mais pratica possivel

 

imagina um formulario com 30 campos você teria que fazer isso:

 

$campo = $_POST["campo"];

$campo2 = $_POST["campo2"];

$campo3 = $_POST["campo3"];

$campo4 = $_POST["campo4"];

$campo5 = $_POST["campo5"];

$campo6 = $_POST["campo6"];

$campo7 = $_POST["campo7"];

etc...

 

e com foreach apenas 1 linha

foreach ($_POST as $campo => $valor) { $$campo = $valor;}

 

e é exatamente a mesma coisa só que muito mais pratico e rapido

o loop pega os dados vindos do form e cria as variaveis com o mesmo nome

 

nao tem nada haver com register_globals, register_globals nao usa $_POST

 

um exemplo de register_globals = on

 

antes a pessoa só fazia isso:

 

if($admin == 1) {
echo "sucesso";
} else {
echo "erro";
}

 

assim a pessoa poderia digitar na propria url admin=1 que passava

 

mas usando register_globals = off e:

 

$admin = $_POST["admin"];
if($admin == 1) {
echo "sucesso";
} else {
echo "erro";
}

 

nao tem como a pessoa fazer isso, tem muito mais exemplo, mas a questao é que register_globals nao tem nada haver com a função foreach

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro que não tem nada haver e eu sei disso, nisso ele falou besteira !!

Mas o que tem haver é que se você tiver 30 campos no seu formulário e na resposta você pegar estes 30 campos um por um (haja saco !) com o $_POST nenhuma variável poderá vir de gaiato (vir junto), porque você simplesmente declarou somente estas 30 variáveis !

Já com o foreach ele está fazendo o loop do array $_POST, então aí sim poderia vir uma variável de gaiato que o forech listaria junto !

 

Mas claro que seria muito difícil !

Compartilhar este post


Link para o post
Compartilhar em outros sites

heheh. e ae galera.Parece que a discussão tá de volta. heheaheÉ o seguinte: se eu estiver errado me corrijam.1:

register_globals nao tem nada haver com a função foreach

Realmente nao tem nada a ver. Mas da forma que a instrução foreach tá sendo usada, ela faz a mesma coisa que o register_globals=on.Vejam isto:
... //seu código inicialforeach ($_POST as $campo => $valor) { $$campo = $valor;}foreach ($_GET as $campo => $valor) { $$campo = $valor;}... //a continuação de seu código
Pra mim a sequencia acima faz a mesma coisa que register_globals=on, nao faz? ou to enganado? Portanto o perigo é o mesmo que o register_globals=on (é até mais perigosa conforme explicarei futuramente) Como eu já falei acima, a única diferença entre o código do cara e o register_globals é que o primeiro pega só post, porém como eu acabei de colocar no código acima, ela pode ser modificada pra pegar get tb. O que diferencia é o uso.2.

register_globals nao usa $_POST

não entendi... :( 3.

o Hacker teria que saber o nome da variável usada no include

Quando eu falo em segurança, não falo apenas em proteger de hackers, mas também proteger o código de fluxos não previstos.

4.

e ser pratico programação é isso saber fazer as coisas e forma mais pratica possivel

você pode ser prático e com segurança no fluxo ao mesmo tempo.É só você utilizar a função lá em baixo, no final do código, após a utilização de todas as variáveis e usar session também pra controlar (isso é só uma forma de se implementar). Isso aí vai do programador.

Por isso o pessoal RECOMENDA não utilizar funções inseguras, pois não se sabe se o programador vai manezar e utilizar a função/recurso de forma incauta ou de forma segura.

5. pra finalizar por enquanto

assim a pessoa poderia digitar na propria url admin=1 que passava

E da forma que coloco abaixo? passa ou nao passa ?
foreach ($_POST as $campo => $valor) { $$campo = $valor;}if($admin == 1) {echo "sucesso";} else {echo "erro";}
E então? não deu na mesma que register_globals=on?6. Vamos continuar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops. só pra filtrar nossa discussão e agente progredir mais rápido:Todos concordamos que a register_globals=on é perigosa né? Meu desafio agora é provar pra vcs que o foreach conforme usado no início do post tem a mesma função ou é tão perigoso (ou até mais) quanto o register_globals.Agora tentando responder ao newbiebruno:1.

Se vem um form com outro nome e na hora da query nao existir o campo qual mensagem de erro que daria?

Não daria erro na sql, pois na sql geralmente se usa o nome do campo/variável mesmo para montar. Dessa forma:
$sql = "select * from tabelaX where nome like ".$nome
Mesmo se fosse mandada outra variável qualquer, ela não estaria na sql portanto não dará erro de sql.2.

Ese eu colocasse um comando SQL INJECTION no meio do caminho ficando dentro da query, quebrando apenas com um ;

Não entendi. :( acho que seria um sqlinjection normal...3.

E um nome diferente, o que aconteceria?

aconteceria que você criaria uma nova variável com aquele nome. e o perigo reside nisto pois pode ser que esta variável criada já exista no código, comprometendo o fluxo. (não sei se era isso que você queria perguntar)

Compartilhar este post


Link para o post
Compartilhar em outros sites

micox pare pra pensar um pouco você ta viajando muito cara se acha que eu nao conheço sobre register_globals? eu que sempre bato nessa tecla pra nao usarem sou totalmente contra agora você vem falar que a função foreach é a mesma coisa? se ta viajando

 

exemplo 1:

 

$campo = $_POST["campo"];
$campo2 = $_POST["campo2"];

echo $campo.$campo2;

 

exemplo2:

 

foreach ($_POST as $campo => $valor) { $$campo = $valor;}

echo $campo.$campo2;

 

os 2 exemplos irao mostrar o mesmo resultado

 

agora onde você ta vendo register_globals ai?

 

antes de falar pare e pense analise

 

Talvez a mudança mais controversa no PHP é quando o valor padrão para a diretiva do PHP register_globals passou de ON para OFF no PHP 4.2.0. Confiança nesta está diretiva foi bastante pública e muitas pessoas nem mesmo sabiam que ela existia e assumiam que ela é apenas a forma como o PHP trabalha. Esta página irá explicar como alguém pode escrever um código inseguro com esta diretiva, mas mantenha em mente que a diretiva por si só não é insegura, mas o seu uso incorreto sim.

Quando register_globals esta em on injetará (veneno) em seus scripts, todos os tipos de variáveis, como variáveis request de formulários HTML. Isto junta-se com o fato deo PHP não exigir inicialização de variáveis siginifica que escrever códigos inseguros é muito mais fácil. Não foi uma decisão difícil, mas a comunidade PHP decidiu, por definição, desabilitar esta diretiva. Quando on, as pessoas usavam variáveis ainda sem saber realmente, com certeza, de onde elas vinham e podiam apenas supor. Variáveis internas que estão definidas no próprio script conseguem se misturar com dados requisitados enviados pelos usuários e desabilitando register_globals muda isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Fabyo.como eu já disse acima, acho que todos concordamos que a register_globals é insegura por isso ignorarei a última parte de seu post.Quando à primeira parte, acho que você próprio me deu armas para a resposta já que quando register_globals=on, o código abaixo tem a mesma função do seu código foreach:

echo $campo.$campo2; //com register globals=on
O código acima terá o mesmo resultado que:
foreach ($_POST as $campo => $valor) { $$campo = $valor;}echo $campo.$campo2;
E então? terá ou nao terá?Como eu já disse: a única diferença entre este uso do foreach(sendo usado com variável de variável) acima e do register_globals=on é o GET. Porém como eu também já disse anteriormente, isto é facilmente resolvido.Ah. e não pensem que sou o único que pensa assim no mundo. Entrem em www.php.net e leiam o primeiro comentário sobre como EMULAR o uso do register_globals=on.

remi at chillet dot com30-Nov-2005 09:46To simulate register_globals under Apache 2, add these lines in top of code PHPforeach($_POST AS $key => $value) { ${$key} = $value; }foreach($_GET AS $key => $value) { ${$key} = $value; }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.