|
| Publicidade |
|
|
|
Comentários de Usuários
Quase isto que quero...
Ítalo,
Seu artigo é excelente, seja pelo conteúdo, seja pela linguagem acessível utilizada. O que penso em fazer é uma validação usando sessions mas sem usar o FORM nem o Banco de dados. Pretendo usar um header para pedir autenticação e validar comparando com uma variável criada num include.inc da vida... O problema está justamente na hora de verificar nas demais páginas se o usuário se autenticou ou não... poderia ser usado session neste caso?
Re: Quase isto que quero...
Obrigado Lyma. Então, não vejo problema nenhum...... a partir do momento que vc registrou na sessao..... em todos os scripts, vc starta ela e recupera a informação sem problema.... se tiver duvida, pode postar sua codificacao e eu lhe ajudo, ok.
Abraços.
Re: Re: Quase isto que quero...
Então poderia (ao obter sucesso na autenticação) criar uma session registrar uma variável $login="ok" e em cada script startar a session e verificar se a variável existe para exibir a página?
Re: Re: Re: Quase isto que quero...
Lyma, no teu caso, acho que o melhor seria usar cookie, como já havia dito na faq que respondi referente a esta mesma dúvida !
Re: Re: Re: Re: Quase isto que quero...
Vou localizar a FAQ e verificar o que seria melhor.
Obrigado pela ajuda. E continue com este excelente trabalho que vem realizando no PHPBrasil. A comunidade agradece a colaboradores como ti. Um forte abraço, Lyma http://www.lymas.com.br
Re: Re: Re: Re: Quase isto que quero...
Entao.... acho q a session seria muito mais segura do que o cookie.
Falhas de Segurança
Este esquema de autenticação apresentado apresenta falhas de segurança , já exploradas diversas vezes na Internet.
Como o script utiliza nomes de variáveis fáceis de advinhar ($login e $senha) e faz a verificação de usuário e senha em um só comando SQL, é fácil fazer um "SQL Injection" : principal.php?login="nada OR 1=1#" . Pronto, é so aplicar um URLEncode na string acima e chamar no navegador...
Re: Falhas de Segurança
Daniel, grato pelo aviso mas a intenção eu demonstrei no início do artigo. Uma outra coisa...... tenho alguns sistemas na internet no qual eles trabalham desta maneira e apliquei inclusive algumas dicas de um amigo que publicou um artigo aqui na phpbrasil e nao funcionou... como este caso q vc postou ai......
Mas agradeço pela dica e se tiver mais alguma correção, por favor... me ajude!!!
Re: Falhas de Segurança
Ah, outra coisa, Daniel..... existe uma grande sacada tbm que eh.... qdo vc executa este login=' or 1=1'.. etc.... o q vc retorna do banco eh vazio.... consegue enxergar o q eu estou demonstrando.... se o cara fizer uma validacao.... morreu, amigo.
se vc tiver algumas tentativas de burlar o sistema..... gostaria que mandasse pra mim, por gentileza, soh pra eu testar..... se funcionar te posto a resposta...... VALEU AMIGO!!!!!
Muito bom
O artigo está excelente. resolveu meu problema.
Re: Re: Re: Re: Re: Quase isto que quero...
Não entendo porque seria mais seguro? Basta usar criptografias, além do mais, era apenas para guardar a indicação de que o usuário já logou... ou seja, o usuário faria o login uma única vez e nas outras páginas apenas seria verificado se o cookie estava setado ou não, caso estivesse, sinal de que o usuário já passou pelo login, do contrário, direciona o usuário para o processo de login...
:-)
My SQL
Prezados Srs,
A empresa onde trabalho está pensando em começar um trabalho onde desenvolveremos soluções usando PHP e My SQL. Onde posso conseguir as licenças desse Banco?
Re: My SQL
O MySQL é free.... então eu acho q naum precisa de licença.. vc pode baixa-lo no
www.mysql.com e o php ..... na www.php.net
Excelente??
Não seria mais prático verificar o login apenas uma vez e se for encontrado o registro, seria gerada uma sessão? E nas outras páginas que precisam de autenticação, bastaria apenas colocar uma condição para verificar se a sessão está ativa ou não.
Re: Excelente??
Seria mais prático mas não seria mais seguro.
Re: Re: My SQL
Buenas !
Tchê italo o artigo ta bueno soh gostaria de fazer uma pequena correcao referente ao mysql, ele eh free se vc for usa-lo sem fins lucrativos caso contrario se vc for vende-lo em anexo com um sistema feito por vc(por exemplo) vc eh que teria que pagar a licenca que gira em torno de U$200 dolares. Valeu, Gordo
Usa encriptação!
Se vc usar a senha em md5, além de ser mais seguro, tira essa coisa do injection, já q se vc por: ' or 1=1 ele não vai conseguir, pq irá ter um and com a senha, e nao da pra por ' or 1=1 estando encriptado com md5!!
Como tenho paranoia, tb ponho um check pra ver se tem caracteres não alfanumericos! =)
Re: Usa encriptação!
Então samuel, nao sei se vc viu...... mas no inicio do codigo eu faço a concatenação do login e da senha...... ali vc poderia aplicar o hash... eh esta a minha visão....
Eu coloquei o artigo assim, respeitando os iniciantes na linguagem..... eh q tem gente q naum entende.... velho Valeu pela atenção e obrigado por enquanto.
Re: Re: Re: My SQL
Valeu Gordo...
Duvida
Estou com uma duvida simples:
Qual é a função da variavel no segundo bloco do codigo que junta o login e a senha: $conc = $login.$senha; ???????
Re: Duvida
Não tem função.... o ponto (.) jah faz a concatenação das duas strings....
Re: Usa encriptação!
O SQL Injection que eu apresentei :
" OR 1=1#" funciona mesmo que as senha esteja criptografada. Isto acontece porque o caractere "#" indica inicio de comentário! Ou seja o resto do comando SQL que verifica a senha vai ser ignorado. Italo : Eu ja testei este SQL Injection e funcionou .... Outros tipos de SQL Injection estao no proprio manual PHP : http://www.php.net/manual/en/security.database.php Eu acho que resolver este problema (pelo menos em parte) , seria interessante ao fazer a query, armazenar o login a senha que vieram do banco em variávei e compará-las com os dados vindos do usuário no código PHP.
Segurança.
Evitando-se maiores contratempos eu mudaria a linha 3 para:
$sql = sprintf("SELECT nome FROM tabela_usuarios WHERE usr='%s' AND passwd='%s';", addslashes($username), md5($password)); Ou algo do tipo. Lembrando que a senha deve ter sido criada também com a função md5(). (validar tudo antes é válido, mas fora do escopo do tutorial) Mesmo sabendo que o artigo é direcionado ao iniciante no PHP, temos que lembrar que é "desde criança que se aprende" :) Que tal um bom Artigo sobre segurança em formulários? Quem se habilita?
Re: Re: Usa encriptação!
Daniel, não duvido, de sua capacidade... mas cara... tenho sistemas aqui... estou preenchendo o formulário com login=" OR 1=1#" e senha=" OR 1=1#" e não entra... eh por isso que eu tenho dúvida, ok
Nao tenho nenhum ressentimento e para isso vou disponibilizar este esquema de cadastro em minha página e passar pra vc testar esse tipo de sql injection.... Valeu novamente, Daniel.
Re: Segurança.
Lyma, eu sempre aplico o hash na concatenação, ou em qualquer tipo de senha que trabalho.... qdo disse que era pra iniciante.... a minha idéia não é de fazer uma porcaria de artigo.. e sim para que entendesse de uma forma simples.
"Algumas vezes, a jaca cai em nossos braços mas estamos preparados para carregar uma uva". Grato.
duvida
seguinte.. uso autentificacao assim:
o cara digita o login e a senha no form.. e eu fasso uma busca no bd com o login e a senha.. se voltar algo o cara tah logado sei q eh MUITO inseguro.. mas oq q eu fasso pra tornar seguro? q funcao faz NAO passar os codigos q na devem passar?
teste e nao deu
colokei isso no form de login e senha e nao deu:
=" OR 1=1#" disse simplesmente q a senha estava incorreta.. =)
Re: teste e nao deu
Então cara..... eh o que eu obtenho qdo faço este mesmo teste....
Meus scripts não possui problemas com SQL Injection........ mas estou esperando dos amigos algumas formas para quebrar isso. AGORA QUEM ESTÁ INTERESSADO EM SQL INJECTION, SOU EU
hehe
tb to muito interessado nessas bagaSSa... jah testei varios.. e nunca kebra nada do sistema...
mas vamo ve q q da =)
Pres. Prudente RLZ
<?php
echo "Italo, eh isso ae mano! Eh a galera de Presidente Prudente comandando no PHP...\nEu tb sou de prudente e tb sou da UNOESTE, sou da turma de TI, meu primeiro termo cara...\nMai eh nois!"; ?>
Não precisa ser desse jeito!
Usar autenticação por propagação somente pela sessão não é nem muito seguro nem muito eficaz. É simples acabar com problemas de segurança e de propagação de variáveis.
Após a autenticação, salve em uma tabela separada no mysql o PHPSESSID e o login da pessoa que se logou. Cada página que a pessoa for entrar, é só verificar nessa tabela se a sessão tá guardada lá. Se não quiser ficar guardando lixo, coloque um campo para se colocar o unixtime e na função de logar peça para que o php apague por um certo tempo. Qualquer hora posto um artigo sobre isso :) Um abraço.
Re: Re: Re: Usa encriptação!
Italo,
O SQL Injection neste caso é substituir a variavel login por : "qualquercoisa' OR 1=1#" Como fazer isso? Tem que pegar primeiro a versao URLEncode desta string. Faca um script PHP que retorne a funcao urlencode() desta string. O retorno vai ser : qualquercoisa%27+OR+1%3D1%23 Agora va no browser e coloque no endereço : http://servidor/caminho/principal.php?login=qualquercoisa%27+OR+1%3D1%23 O seu comando SQL vai ficar : SELECT nome FROM tabela_usuarios WHERE usr=’qualquercoisa’ OR 1=1# AND passwd=’$senha’ O caractere # é comentário em SQL. Logo tudo que vem depois dele vai ser ignorado. Entao se sua senha era criptografada ou hasheada, nao vai adiantar de nada. Como a condição de sua query SQL vai ser verdadeira sempre, entrao ela vai retornar todos os nomes de usuários da tabela "tabela_usuario". Seu sistema então vai autenticar este intruso como o primeiro usuário da tabela. Isso é SQL Injection. Eu nao descobri isto, isto está publicado no manual do PHP! Regra única de segurança : Nunca confie em dados vindo de usuários ou de cookies. Sempre trate eles com expressões regulares. Isto evita 99% dos ataques a sistemas web. Saudações
Re: Re: Re: Re: Usa encriptação!
Valeu Daniel..... pela dica......
Eu usei essa sql injection e nao funcionou.... mas valeu e obrigado.
Sessions
Alguém possui um tutorial que trate especificamente de sessions em php. Estou precisando de um, pois preciso fazer um site para inscrição em um concurso e pelo que aindei estudando a melhor maneira de fazer a verificação dos usuários, bem como a passagem dos seus dados pelas páginas seria utilizando sessions.
Antecipadamente agradeço Noal
Re: Sessions
Buenas!
Tchê, procura aqui no site que tem um artigo que fala sobre sessions e bem interessante. Valeu, Gordo
Gostei muito...
Esta é a primeira vez que acesso esse Site, mas não vai ser a última, gostei muito da maneira como tratou esse tutorial.
Parabéns: Pelo artigo; Pelo Site. 10 Valeu´s []´s Dieguito
Muuito Bão!!!!!
Estava precisando muito de um script desses!!! pois tenho um site onde precisava proteger algumas partes e ele funcionou muito bem!!!
parabéns e obrigado!
COMO MANDAR O USUÁRIO PARA UMA QUARTA PAGE?
Como mando um usuário para quarta pagina após o principal.php e autentificando a session, para que não possam entrar do nada no sistema...
RE:COMO MANDAR O USUÁRIO PARA UMA QUARTA PAGE?
ASCII, vc pode usar o header e manda-lo para a pagina desejada, lembrando que vc não pode definir nenhum tipo de codigo html antes do header, senão ele não funfa!
<? header("Location: http://www.suapagina.com.br"); ?> []'s adell
password(' ')
Cara, minha duvida nao e tao sinistra como algumas que via aparecendo por aqui. Quando cadastro um usuário, uso a encriptação do mysql password('senha'). Até ai tudo bem, mas como faço pra validar o usuário depois? Existe alguma funcao em php que sirva para desemcriptar o password do mysql? Como ficaria $sql = ”SELECT nome FROM tabela_usuarios WHERE usr=’$login’ AND ??? ?
Mais uma coisa, essa encriptação do mysql é segura ?
Re: password(' ')
Cara usa o função encode() e decode() a função q vc esta usando não tem como descriptografar
Re: password(' ')
Buenas!
Soh um comentario: "Hoje em dia nada é 100% seguro.". Valeu, Gordo
PASSWORD
nao rola usar where login = '$login' and senha = PASSWORD($senha)
pra ele criptografar e procurar por ela criptografada?
interesse em saber!
Eu estou querendo fazer um site de busca para minha cidade mais eu nao estou entendendo muito o desenvolvimento.. estou a procura de um livro q me encine melhor se vc saber de algum por favor me mande um e-mail estou disisperado pq essa ideia ja vazou e ja tem pessoas super interessadas em fazer esse site e eu nao quero pagar paa alguem fazer eu mesmo quero fazer sakou, para eu aprender a mexer e ficar nesse ramo!
Administrador de Base Dados MySql
Olá Amigos
Gostaria de saber, se alguém aqui do fórum sabe onde posso encontrar um programa que faça a administração on-line de uma base dados em MySql. Eu cheguei a utilizar o phpMyAdmin, mas teve uma certa vez que encontrei um programa que era a cara do Access. Depois perdi o programa e a página onde baixei. Será que alguém conhece este programa? Valeu galera!!!
PASSWORD
Gostaria de saber se há uma resposta para a pergunta do rafael "logo acima", pois estou com a mesma duvida !!!
Na hora de criptografar a senha no insert vai tranquilo o comando PASSWORD('senha'), mas na hora de checar no select com o comando WHERE senha_sql_criptografada = PASSWORD('$senha_login') retorna sempre vazio !? gostaria de saber se há uma solução para isso !!!
Re: PASSWORD
Beto e rafael, eu faço de forma diferente. Eu uso md5 na hora de inserir e na hora de logar tbm.
$login=italo $senha=123456 $conc=$login.$senha;// PARA ENTENDIMENTO $senha=md5($conc); insert into TABELA values ($login,$senha) na tentativa de logar no sistema, o usuario entra com seu login e senha..... e para verificar eu faço o seguinte $conc=$login.$senha; $senha=md5($conc); $tem=mysql_num_rows(mysql_query("select * from TABELA where login='$login' and '$senha')); logico q eu nao pergunto qtas linhas veio... o questionamento q uso eh um pouco mais complexo mas assim jah dah pra notar, ok.
Re: Re: PASSWORD
Agora ficou blz... Valeu !
Erro
Fatal error: Call to undefined function: () in D:\WebSite\\verifica_sessao.php on line 6
pq ta dando isso? copiei igualzinho da pagina ???
Re: Erro
a opcao de habilitar session no php.ini está desabilitada..... tem que habilitar senao ele nao registra a sessao.
Eh q na maquina q estou agora nao tem php.ini... mas dah uma procurada por session no php.ini e habilita... eh esqueminha tipo 1 ou 0
Re: Re: Erro
$sql = "SELECT * FROM login WHERE user='$login' AND pass='$senha'";
ele nao ta comparando isso certo? tem algo no php que nao deixa comparar assim, fiz um login antes com http_post_vars ele deu, assim nao da
urgente
italo me ve um contato mais rapido...
vc tem icq? msn? mirc? algum chat...
Monografia e PHP
Estou concluindo o curso de análise de sistemas e minha monografia será sobre biblioteca digital. Gostaria de desenvolver um protótipo de um site em php para a coordenação do curso, através do site será possível acessar monografias, trabalhos, textops, etc., dos alunos e dos professores do curso. Detalhe: meu tempo está acabando e agora que estou aprendendo php, pelo que vi é semelhante ao C e, já estudei C. O que quero saber é: quanto tempo, em média, um iniciante demora pra fazer algo que, aparentemente, é tão simples? Se alguém quiser me dar dicas de código eu agradeço.
Nao intendi
eu queria saber como faz para por banco de dados em meu site... eu nao intendi direito..
o cara faz cadastro e depois vai na senha e login... e ve seus dados... como faz????
Erro no código
Peguei o código e fiz como esta descrito na página mais ocorreu este ERRO:
Fatal error: Call to undefined function: () in c:\arquivos de programas\apache group\apache\htdocs\login\verifica_sessao.php on line 5 Onde eu errei e como posso concertar este código e por favor o include conexao.inc que informações ele deve conter, algem pode me mandar um arquivo pronto e com a base de dados certa. Obrigado, Leandro Almeida
Ajuda
Peguei o código e fiz como esta descrito na página mais ocorreu este ERRO:
Fatal error: Call to undefined function: () in c:\arquivos de programas\apache group\apache\htdocs\login\verifica_sessao.php on line 5 Onde eu errei e como posso concertar este código e por favor o include conexao.inc que informações ele deve conter, algem pode me mandar um arquivo pronto e com a base de dados certa. Obrigado, Leandro Almeida
Re: Ajuda
<?php
$USUARIO[0] = $login; $conc = $login.$senha; $USUARIO[1] = $senha; $session_register(“USUARIO”); ?> perceba que ele nao está conseguindo registrar a sessao.... eh problema no php.ini a opcao de habilitar session nele esta desabilitada.... eh soh abilitar... vah no c:\windows\php.ini e procure a opcao e caminho para a session... tlz o caminho para a sessao eh do linux e nao do windows ai.. eh soh vc alterar... [Session] session.save_handler = files ; handler used to store/retrieve data session.save_path = c:\php\session_data ; argument passed to save_handler ; in the case of files, this is the ; path where data files are stored session.use_cookies = 1 ; whether to use cookies session.name = PHPSESSID ; name of the session ; is used as cookie name session.auto_start = 0 ; initialize session on request startup session.cookie_lifetime = 0 ; lifetime in seconds of cookie ; or if 0, until browser is restarted session.cookie_path = / ; the path the cookie is valid for session.cookie_domain = ; the domain the cookie is valid for session.serialize_handler = php ; handler used to serialize data ; php is the standard serializer of PHP session.gc_probability = 1
Erro de sessão
Tentei fazer o exemplo, me deu os seguintes erros:
Cannot send session cookie - headers already sent by Cannot send session cache limiter - headers already sent Quem puder ajudar....
Para acabar com o problema da Senhas!!!!
<corta>
$login = $USUARIO[0]; $senha = $USUARIO[1]; //modifiquei a sql coloquei usr,passwd para //serem selecionado tb $sql = ”SELECT nome,usr,passwd FROM tabela_usuarios WHERE usr=’$login’ AND passwd=’$senha’”; include “conexao.inc”; $logado = mysql_fetch_row(mysql_query($sql,$cone)); //com isso deve ter vindo resultados... //vamos supor que sim //A jogada esta aqui!!! if ($logado[1] === l$login && $logado[2] === $senha) { echo “Seja bem vindo usuário $logado[0]”; // boas vindas com o nome do usuário // ou poderia montar a pagina dinâmica ou estática, dependendo do problema. } else { echo “<a href=index.php target=_parent>Usuário Inexistente</a>”; } ?> Espero com isso acabar de vez com os problemas de senha do pessoal!!! FORA SQL INJECTION =] PS1: mesmo aplicando SQL Injection o lance não vai funcionar pq a variavel $senha não vai bater com $logado[2]... PS2: Utilizem nomes de variaveis não usuais de mais... tipo para usuario -> $login e para senha -> $pass Falow mocada!!! No Flames!!!
Sobre as Sessions sobre o IE 6
Caro Ítalo, seu artigo é muito interessante e estruturado, gostaria apenas de colocar uma ressalva: não foi possível criar uma sessão sobre o IE6 em win2000, mas em uma versão menor do IE este código funciona. Este comentário é pertinente também para cookies onde todos os parâmetros devem ser preenchidos para que o cookie seja criado.
Caso algum parâmetro não seja informado não é possível criar o cookie. Caso alguém verifique um erro no meu comentário,por favor me corrija. Boa Sorte a todos. Eduardo
Não funcionou
Prezado, como estou começando a trabalhar com PHP, algumas perguntas:
- Escrevi e executei o código exatamente como consta no artigo, entretanto observei que o mesmo não funcionou, ou seja, os valores das variáveis login e senha em index.php não são "vistas" em principal.php. Há alguma configuração em php.ini que deve ser ajustada ?? - a linha $session_register(“USUARIO”), de verifica_sessao.php, onde está "sobrandro" um $, deveria ser session_register('USUARIO') ?? ou session_register("USUARIO") ?? - apesar de um colega já ter perguntado para que servia a linha $conc = $login.$senha, não entendi a resposta. A variável $conc tem algum objetivo ou uso posterior ?? Abraços, Walter.
SQL Injection
Eu testei o SQL Injection direto no código, e ele funcionou, mas quando ele vai via url, todo a injection transforma-se em um string:
Select * from tbusers where login = 'algo OR 1=1'... Mas apesar de tudo naum consegui fazer esse injection funcionar mesmo com o urlencode(), se alguem que conseguiu fazer funcionar me mostrasse quais são os passao corretos, eu agradeceria. Daniel C. Barreto
Re: Não funcionou
aq tb nao funcionou, gostaria de saber pq!
Dúvida!?!?!?
Excelente o tutorial.
Mas eu gostaria de saber com faço pra logar os usuários cadastrados no linux em uma sessão do php, ao invés de procura-los no mysql. Alguma sugestão?!?!?
ERROS
Este script não funciona na minha h, sera que alguem tem algum outro tipo de autenticação de usuarios.
Parametros
tenho uma page que usa session para o contador de acessos.... o script funciona perfeitamentem, mas na primeira vez em que o usuario entra na hp, quando a sessao é registrada, todos os links da pagina ficam mais ou menos assim: link.php?meuparametro&PHPIDSESSION=21093871832712opihasdf
como eu uso parametros, os linkis da primeira vez em que o usuario entra na pagina ficam errados! como evitar isso"?
SQL Injection
Já vi vários artigos para burlar login e senha através da url, testei diversas vezes e não rolou nada.
Re: Administrador de Base Dados MySql
Véio já ouviu falar em MySQLFront, é o que eu uso e recomendo, talvez seja disso que cê tá falando... Procura na superdownloads.com.br que deve ter...
Um Abraço! E adoro essa page!!
erro no codigo
na linha onde se le
$session_register(“USUARIO”); NAO SERIA apenas: session_register(“USUARIO”);
SQL Injection
Pq vcs nao fazem o seguinte teste.
SELECT * FROM usuarios WHERE password('$senha') AND login='$login'; assim o primeiro teste é a senha criptografada pelo próprio mysql. E aí alguém consegue burlar isso.
SQL Injection
Se o php estiver configurado com 'magic_quotes on' no php.ini, ele bota backslashes(\) automaticamente em aspas nas strings de GET/POST/Cookies.
Se estiver assim, o injection vai ficar junto com a string (='senha injection') e nao como comandos do sql, pois não ha como encerrar a string. Nas versoes mais recentes do php, magic_quotes esta desligado por default. [retirado de php.ini] ; - magic_quotes_gpc = Off [Performance] ; Input data is no longer escaped with slashes so that it can be sent into ; SQL databases without further manipulation. Instead, you should use the ; function addslashes() on each input element you wish to send to a database.
SQL Injection
Olá pessoal,
Sou novo PHProgrammer, acho que entendo porque a maioria não conseguiu fazer o SQL Injection funcionar simplesmente por que esqueceram " ' " no meio da string, sem isso a parte que realmente faz efeito " or 1=1 #" fica fazendo parte da string $user e não do comando sql. SELECT * FROM usuarios WHERE user ='$user' AND pass = '$pass' se colocarmos user = BLAH' or 1=1 # codificados no url a string com o injection ficaria: SELECT * FROM usuarios WHERE user ='BLAH' or 1=1 #' AND pass = '$pass' ou seja a primeira condição user ='BLAH' estaria errada, o " ' " depois de 'BLAH é o que estava fazendo diferença, pois ele fecha a string e continua com o comando sql... então a segunda parte 1=1 seria considerada uma condição correta obvio e #' AND login = '$pass' será ignorado. Percebam que o " ' " depois do # é o original do comando sql, que foi kicado. Acho que a solução do Maximo Poder também, se bem que no meu caso se a opção magic_quotes estiver desabilitada, ja era pq meu site está hospedado em um provedor. A do Samuel, que checa por caracteres não alfanumericos antes da consulta sql seria mais aconselhavel, pois funciona em ambos os casos. gostaria de saber agora existe uma função como esta pronta. Legal isso que o Daniel falou não sabia que sql injection existia.
SQL Injection
Eu uso o seguinte no topo dos meus scripts:
if (!ini_get("magic_quotes")) { foreach ($_REQUEST as $key => $value) $_REQUEST[$key] = addslashes($value); } $_REQUEST armazena todas os dados q sao enviados pelo usuario e portanto nao podem ser confiados. Nunca testei, mas deve funcionar.
Erro
Eu testei as scripts mas deu um erro, na script verifa_sessao, na linha 5:
$session_register(“USUARIO”); Deu essa mensagem: Erro Fatal: Call to undefined function: () in verifica_sessao.php on line 5 O que aconteceu? Valeu
Re: Erro
Cara.... foi um erro meu.....eu coloquei $ no session_register.....e nao tem.... é só
session_register("USUARIO");
Mais sobre segurança...
Falaram bastante a respeito da segurança de entrada de dados mas acabaram esquecendo uma falha que pra mim deve ser considerada como mais grave...
Qdo utilizamos a função include, temos que ter cuidado com o nome que será dado ao arquivo, se o arquivo for chamado como no exemplo acima conexao.inc, se vcs tentarem visualizar o arquivo no navegador vcs vão obter duas resposta: -> Se o administrador do servidor colocou o .inc como uma extensão do php não vai aparecer nada na tela -> Mas se não foi adicionada essa opção, o navegador vai abrir uma janela de diálogo perguntando o que vc deseja fazer com o arquivo, se o "hacker" copiar o arquivo vai ter acesso ao nome do usuário e senha de conexão ao Banco de Dados. Se vc não é administrador do servidor e quer evitar esse problema basta modificar o nome do arquivo para conexao.inc.php, assim vc vai continuar sabendo que é um arquivo de include, mas se tentar abrir no navegador nada vai acontecer... Um grande abraço a todos e boa sorte na segurança dos sistemas, Auad
Sobre o SQL Injection...
Sou eu de novo...
Todas as tentativas do SQL Injection falharão por um motivo bem simples, qdo usamos por exemplo: ?login=teste%27+OR+1%3D1%22;%23 estamos tentando obter uma linha de comando parecida com essa, já em substituição na query: SELECT * from tabela WHERE login='teste' OR 1=1";#' AND senha='' o que teoricamente se o login não fosse ok o 1 sempre será igual a 1, só que o que acontece é que qdo usamos aquela url codificada obtemos: SELECT * from tabela WHERE login='teste\' OR 1=1\";#' AND senha='' repare que antes da aspa simples adicionada através do %27 e da aspa dupla conseguida através do %22 foi adicionado uma \ para poder escapar as aspas e considerar ela como um caracter, se alguém conseguir evitar que ela seja considerada um caracter e seja considerada como o fim de uma instrução o SQL Injection vai funcionar, assim acredito! Se alguém conseguir, mande uma resposta...
Minimizando problemas
pra minimiza o problema, poderíamos evitar logins q contenham espaço, os caracteres "=" e "#", e aspas...
isso talvez não deixará seu sistema 100% seguro, mas em relação à este problema resolverá...
Re: Minimizando problemas
soh por segurança msm, permita apenas senhas e usuários compostos por letras e números, evitando principalmente espaços, =, &, #, pontos e vírgulas...
utilize a condição IF na hora do registro d usuario. um exemplo simples que proibi os principais caracteres utilizados para 'burlar a segurança': <? $usuario = str_replace("'", "", $usuario); $usuario = str_replace('"', '', $usuario); if (strlen(ereg("[(.#$%&*,;.!?)]")) != 0) { echo "Caracteres inválidos"; } else { *página* } ?> usar '' nas variáveis do mysql_query tb ajudam. ex.: WHERE login='$login' ao invés de login=$login para maior segurança.
Re: Re: Minimizando problemas
Uma pekena correção, eskeci d coloca a var no ereg:
troque: if (strlen(ereg("[(.#$%&*,;.!?)]")) != 0) { por: if (strlen(ereg("[(.#$%&*,;.!?)]", $usuario)) != 0) { =P
Sobre Session
Italo,
só tem alguns detalhes que precisam ser esclarecidos... sobre o que eu li nos manuais do PHP e pesquisas, as funções session_start() e session_destroy() não levam argumentos nenhum, ou seja, session_destroy("USUARIOS") seria a mesma coisa que session_destroy(). Correto? E outra coisa... Tem que cuidar se o PHP foi compilado com --enable-trans-id senão, tem que propagar o SID através da URL
Segurança
Ei Ítalo, que tal voce ou algum outro colunista criar um artigo sobre segurança, já que esse aqui nem era sobre isso mas acabou tendo muitos comentarios.
O assunto é de importancia e bem extenso.
Sessions ainda são muito abstratas por mim...
Gostei muito deste artigo. Apesar de ainda não entender direito sessions.
Quanto ao SQL injection, acho que mesmo usando-o fica difícil funcionar após uma codificação MD5 da concatenação do login com a senha.(algo como: ...$f_user["senha"]= md5($login.$senha);) A senha real seria essa "amálgama" gravado no banco. A senha em mãos do usuário seria usada apenas para valida o "amálgama". Estarei eu certo? Me avisem.
Re: Sessions ainda são muito abstratas por mim...
Nem precisa concatenação se vc usar md5, pq se o cara usar " ' OR 1=1 " na senha, o md5 já codifica no seu método, que utiliza apenas alfanuméricos, solucionando o problema.
Mas se o usuário usar no login q é o problema, por isso usar ereg() na autenticação e no cadastramento, proibindo o envio de caracteres não-alfanuméricos. Como o exemplo q eu citei acima e vo melhora um pouco agora =P : if (strlen(ereg("[(.#$%&*,\";.\'!?)]", $usuario)) != 0 || strlen(ereg("[(.#$%&*,\";.\'!?)]", $senha)) != 0) { header ("Location: erro.html"); } else { ... } simples exemplo que não utiliza o MD5. flw´s
autenticacao
fiz a autenticacao da minha pagina usando variaveis globais...
só que no server, o register_globals ta off... gostaria de saber como fazer pra isso pegar tentei usar esse script e deu erro no array, linha nove. $logado = mysql_fetch_array(mysql_query($sql,$cone)); alguém pode me tirar essas duvidas?
password
como ponho que ao entrar no meu site peça username e passowd???
Re: autenticacao
Rodrigo,
Dê uma olhada no ini_set() se é possivel alterar runtime no server: http://www.php.net/manual/pt_BR/function.ini-set.php Ler os comentários (em ingles).
explicação
estou tentando aprender como funfa o sql injection, e tive noticia que aqui muitos sabem explorar essa falha !!!
intaum eu agradeço ce alguem com uma boa vontade me me explicasse como funciona passo a passo , ce eu preciso de alguma ferramenta, que tipo de sites usa esse banco de dados,desde ja agradeço pois estou tentando aprender isso para por em meu site sobre segurança !!!
Re: password
Vc pode fazer isso com um if.
se usuario não estiver logado entre na página de login, caso já esteja logado, entre na pagina. <?php if ($usuario=="") { echo "<META Http-equiv='refresh' content='0;url=login.php>";} else { echo "<META Http-equiv='refresh' content='0;url=index.php>";} ?> bem, este é um php bem simples, só para te dar uma ideia de como pode fazer.
Valeu Pessoal!!!
Até então eu utilizava um controle de usuários com session bastante simples sujeito a falha de segurança.
Juntei o artigo do Italo, mais as opniões e dicas dos colegas Rafael Farias e Ricardo Guedes e melhorei e muito meu controle de usuários. Valeu Pessoal!!!
Erro na prg
Olá, estou com o seguinte erro
Warning: Cannot send session cache limiter - headers already sent (output started at C:/XITAMI/webpages/teste/verifica_sessao.php:1) in C:/XITAMI/webpages/teste/verifica_sessao.php on line 2 Alguém pode me ajudar a resolver??? grato
!= SQL INFECTION
Não sei pra que tanta tempestade num copo dagua, uma simples verificaçao de caracters QUE NAO DEVEM SER lidos ja resolvem este poblema de sql injection
if (strlen(ereg("[(.#$%&*,;.!?)]", $usuario)) != 0) { echo "<script>window.alert(\"Por razões de segurança você não pode usar estes caracters no usuário (.#$%&*,;.!?)!, tente novamente!\");</script>"; echo "<meta http-equiv='refresh' content='0;URL=index.php'>"; exit; } quero ver alguem "burlar a segurança" com esta regra... abraços a todos os companheiros do phpbrasil
Erro
tentei varias vezes mais infelizmente o erro é o mesmo:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\arquivos de programas\apache group\apache\htdocs\site\admin\principal.phpon line 19 ja mudei as variaveis, e nada! o q acontece? Vi algo no seu codigo q não entendi, em vez de variavel $conc = $login.$senha;(verifica_sessao.php) não seria $cone = $login.$senha;? Valeu e tenha um bom feriado.
duvida sobre session
Gente eu estou com a seguinte dúvida. Por exemplo, eu tenho uma página que roda um script php de validação de usuários com sessions e no meu script tem uma linha tipo a desse artigo que é o session_destroy(); e eu fiquei em dúvida se por acaso um usuário se loga no sistema ai depois vem outro e se loga mas ai pra se logar, ele acessa o script que tem a linha destroy bom, em fim, o que eu quero saber é se um usuário pode fechar uma session que um outro abriu se ele rodar o script com session_destroy.
Bom, obrigado pela ajuda.
logout?
Parabéns Italo! Mt bom o tutorial!
Só tenho dúvida quanto ao logout. Quando eu volto pra página de login e entro com outro usuário, a session continua gravada com o usuário anterior. Como eu faço pra logar com outro usuário sem ter q fechar a janela????
ERROO
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\wamp\www\sistema_historico\principal.php on line 8
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\sistema_historico\principal.php on line 8 O erro é na linha abaixo: $logado = mysql_fetch_array(mysql_query($sql,$cone)); |
|
|||||||||||||||||||||||||||
|
|
| João Prado Maia | ||