1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema sessoes php

Discussão em 'Web Development' iniciada por Fabriziopt, 17 de Agosto de 2007. (Respostas: 25; Visualizações: 2551)

  1. Fabriziopt

    Fabriziopt Power Member

    Boas estive a investigar no livro php5 e encontrei o seguinte codigo que apliquei no meu site
    Mas na hora do login não aceita o registo
    O codigo que inseri foi o seguinte

    Código:
    index.html
    <html>
    <head><title>Login</title></head>
    <body>
    <form action="main.php" method="post">
    Sistema Auntenticado dp Site.<br>
    Login: <input type="text" name="nickname" ><br>
    Senha: <input type="password" name="password" ><br>
    <input type="submit" value="Entrar" />
    </form>
    </body></html>
    
    main.php
    <?php 
    // Login/sessão
    // index.php 
    
    
    include("auth.php"); 
    
    include("nav.php"); 
    
    echo "Esta é a homepage.";
    echo "<br><br>Utilizador - " . $_SESSION['nickname']; 
    
    // Fechar a ligação ao mysql
    mysql_close(); 
    ?> 
    
    auth.php
    
    <?php 
    session_start(); 
    // auth.php 
    // start session 
    
    include("connectDB.php"); 
    
    if($_POST){ 
    $_SESSION['nickname']=$_POST["nickname"]; 
    $_SESSION['password']=$_POST["password"]; 
    } 
    
    // query 
    $result=mysql_query("select * from users where login='" . $_SESSION['nickname'] . "' and password='" . $_SESSION['password'] . "'"); 
    
    // número de registos 
    $num=mysql_num_rows($result); 
    // se não há registos aparece o ecrã de login. 
    if($num < 1){ 
    echo "Não está autenticado. Faça login sff.<br><br> 
    
    <form method=POST action=index.php> 
    Utilizador: <input type=text name=\"nickname\"> 
    password: <input type=password name=\"password\"> 
    <BR> <BR> <BR> <BR>
    <input type=submit value=\" - Login - \"> 
    </form>"; 
    
    exit; 
    } 
    ?> 
    
    nav.php
    
    <?php 
    // nav.php 
    ?> 
    
    <a href=index.php>Home</a> | 
    <a href=pag_1.php>pagina_1</a> | 
    <a href=pag_2.php>pagina_2</a> | 
    <a href=pag_3.php>pagina_3</a> | 
    <a href=logout.php>logout</a> 
    
    <br><br> 
    
    connectdb.php
    
    <?php 
    // connect.php 
    
    
    $hostname="onde esta a base de dados"; 
    $mysql_login="ninkname"; 
    $mysql_password="senha"; 
    $database="nome dabase de dados"; 
    
    if (!($db = mysql_connect($hostname, $mysql_login , $mysql_password))){ 
    die("impossível ligar ao MySQL."); 
    }else{ 
    if (!(mysql_select_db("$database",$db))) { 
    die("Impossível ligar a db."); 
    } 
    } 
    ?> 
    
    Amigos o que estou a fazer de mal
    Obrigado pela disponibilidade
    Abraço
     
    Última edição pelo moderador: 17 de Agosto de 2007
  2. Corpsegrinder

    Corpsegrinder Banido

    a bd ta ok?

    --edit--
    preenchida?
    a password nao ta cifrada na bd?
     
  3. AliFromCairo

    AliFromCairo Power Member

    Déjà vu?
    Aparentemente isso está correcto, verifica se tens dados na BD.
     
  4. Gurzi

    Gurzi Power Member

    Não procurei pelo erro mas vi aí duas coisas que deves mudar.

    Primeiro, nunca se cria uma sessão antes de verificares na base de dados se o utilizador realmente existe. Neste caso tu atribuis a uma sessão o valor do campo e isso é incorrecto moralmente.
    Outra coisa, tenta por sempre aspas no sítio certo, um exemplo <form method='POST'> e não form method=POST>

    Só por questões de validação!

    O que queres dizer com não aceita o registo ??

    O teu sistema está vulnerável a SQL Injection( atenção a isto, MUITA ATENÇÃO)

    Depois tens isto, mysql_select_db("$database",$db)

    não podes por aspas ali, a $database já é uma string, não precisa de aspas!

    Em programação, 0 quer dizer false.

    quando fazes
    $num = mysql_num_rows();

    isto é usar espaço de memória sem ser preciso, mais valia fazeres if(mysql_num_rows())
    isto só entrava se retornar-se true, ou seja, qualquer número diferente de zero.!
     
    Última edição: 17 de Agosto de 2007
  5. Fabriziopt

    Fabriziopt Power Member

    obrigado pela resposta
    quando tento aceder ao site da a pagina de login
    quando ponho os dados nao sao aceites vai para o index.php
    abraço
     
  6. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    index.php? Tens um index.html e um main.php. A qual te referes?

    E toma muita atenção ao que o Gurzi disse. Esse código não deve nunca ser usado na vida real, porque é facilmente contornado através de SQL Injection. Quando isso funcionar (ou seja, com um certo user e pass ele entra; com dados incorrectos dá erro), experimenta usar a seguinte string num campo qualquer:

    Código:
    ' OR 1=1 -- .
    (acho que esta string é a mais famosa, em relação a SQL Injection)


    O código aparenta-me estar ok, salvo o que o Gurzi já disse. Certifica-te de que tens dados na base de dados, na tabela certa ;)
     
  7. Fabriziopt

    Fabriziopt Power Member

    desclupa a nabice mas o que e a string ejection?
    em que pagina ponho esse codigo?
    No codigo eu ponho a db mas nao ponho a tabela onde ponho a tabela?

    abraço
     
  8. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Ok, para já esquece o SQL Injection. Mas é só para já!

    Como é que está a tua base de dados? Tem a tabela "users"? Essa tabela tem as colunas "login" e "password"? E acrescentaste alguma linha nessa tabela?
     
  9. Fabriziopt

    Fabriziopt Power Member

    Eu fiz uma tabela com o nome xboxstage(o mesmo que a bd)
    tem os campos nicknanme e password
    acrescentei um user com password
    abaço
     
  10. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Portanto

    bd: xboxstage
    tabela: xboxstage
    campos da tabela: nickname | password

    nesse caso onde diz
    PHP:
    $result=mysql_query("select * from users where login='" $_SESSION['nickname'] . "' and password='" $_SESSION['password'] . "'");
    troca por
    PHP:
    $result=mysql_query("select * from xboxstage where nickname='" $_SESSION['nickname'] . "' and password='" $_SESSION['password'] . "'");
    e espero que $database = "xboxstage".
     
  11. Fabriziopt

    Fabriziopt Power Member

    sim essa parte ja tinha posto da database a da tabela e que estava em duvida
    abraço
     
  12. Fabriziopt

    Fabriziopt Power Member

    ja esta a dar
    obrigadao se me podessesm ajudar naquela coisa o sql injection agradecia
     
  13. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Tudo bem, agora tens o código funcional, pelos vistos.

    Quando escreves um nome de utilizador E uma password CERTOS, consegues ter acesso ao site. Quando erras algum deles, aparece-te uma página de erro. Até aqui, tudo bem.

    Agora, experimenta colocar a linha seguinte no campo do nickname (como se estivesses a escrever um utilizador) e deixa o campo da password em branco (ou escreve nele o que quiseres, tanto faz):

    Código:
    ' OR 1=1 -- .
    Depois vem cá dizer o resultado ;)

    Já agora, se tiveres as magic_quotes activadas, este código não dará resultado.
     
    Última edição: 18 de Agosto de 2007
  14. Fabriziopt

    Fabriziopt Power Member

    desculpa mas eu estou alujado no hyperphp e isto as x da me erros ...
    Vou me registar no freehostia e ja te digo alguma coisa
    obrigado
    tou para ver o resultado disto ;)
     
  15. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    As you wish :P

    Username: ' OR 1=1 -- .
    Password: (o que quiseres. Até pode ser este comentário!)

    Não sei se o freehostia activa automaticamente as magic_quotes. Espero que não :P
     
  16. Fabriziopt

    Fabriziopt Power Member

    Não da
    Era suposto entrar a mesma ?
    obrigado pela ajuda
     
  17. AliFromCairo

    AliFromCairo Power Member

    As novas versões do PHP vêm com essa directiva activa por defeito.
     
  18. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    É uma pena :\ começam a haver mais programadores preguiçosos e torna-se mais difícil aprender este tipo de coisas. Já a mim me deu um trabalho danado até descobrir que elas existiam. Estava eu a querer descobrir o que era SQL Injection e estava tudo a dar simplesmente bem demais.

    Fabriziopt, acrescenta no início do main.php a seguinte linha:
    Código:
    @set_magic_quotes_runtime(0);
    E faz aquilo de novo. Ainda não testei, mas penso que agora dê.
     
  19. Fabriziopt

    Fabriziopt Power Member

    nao funciona...
    da senha errada
    o que era suposto fazer?
     
  20. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Bah :(

    O que se passa é o seguinte:
    Este é o teu query:

    PHP:
    "select * from xboxstage where nickname='" $_SESSION['nickname'] . "' and password='" $_SESSION['password'] . "'"

    ou seja

    PHP:
    "select * from xboxstage where nickname='$nickname' and password='$password'

    se $nickname = "abc" e $password = "def" então

    PHP:
    "select * from xboxstage where nickname='abc' and password='abc'

    MAS se $nickname = "' OR 1=1 -- ." então

    PHP:
    "select * from xboxstage where nickname='' OR 1=1 -- .' and password='$password'

    O que está após o "--" é comentado. O query executado é o seguinte:

    PHP:
    "select * from xboxstage where nickname='' OR 1=1"

    E isso retorna a tabela toda. Ora, como a tabela toda não dá 0 rows, ele supostamente entra.
    Vou ligar o meu servidor e deixar-te "explorar". Tens PM :)
     

Partilhar esta Página