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

Problema com variaveis PHP

Discussão em 'Web Development' iniciada por The Dealer, 2 de Março de 2009. (Respostas: 7; Visualizações: 704)

  1. The Dealer

    The Dealer Power Member

    Mais uma vez,

    Tenho o seguinte form (preencher varios campos) em adicionaRegisto.php:

    Código:
    <?php  include("connectDB.php"); 
        mysql_select_db("notasgest",$connectDB);?>
          
       <b>Adição de registo </b>
    <form method="POST" action="adicRegistoSO1.php">
    <ul>
    
    <li>Número de aluno<input type="text" name="numero" size="25"></li>
    <li>Apelido<input type="text" name="apelido" size="25"></li>
    <li>Nome <input type="text" name="nome" size="25"></li>
    <li>Curso<input type="text" name="curso" size="25"></li>
    <li>Email<input type="text" name="email" size="25"></li>
    <li>Número de telefone<input type="text" name="n_telefone" size="25"></li>
    </ul>
    <p align="left"><input type="submit" value="Adicionar registo">
    <input type="reset" value="Limpar Ecrã">
    <p align="center">
    </p>
    E o seguinte código php em adicRegistoSO1.php:

    Código:
    <?php
            
        include("connectDB.php");
        mysql_select_db("notasgest",$connectDB);
        
        $sql = mysql_query("INSERT INTO alunosso (numero,apelido,nome,curso,email,n_telefone) VALUES('$numero','$apelido','$nome','$curso','$email','$n_telefone')");?>
    E estou a ter vários erros de variaveis nao definidas (numero, apelido...).

    Como posso eu defini-las neste caso?
     
  2. Baderous

    Baderous Banido

    Se estás a enviar por POST tens de fazer:
    Código:
    $numero = $_POST['numero']
    penso eu de que...
     
  3. Sa[n]dman

    Sa[n]dman Power Member

    Utiliza o seguinte código:
    PHP:
    <?php
        
        $numero 
    $_POST['numero'];
        
    $apelido $_POST['apelido'];
        
    $nome $_POST['nome'];
        
    $curso $_POST['curso'];
        
    $email $_POST['email'];
        
    $n_telefone $_POST['n_telefone'];
            
        include(
    "connectDB.php");
        
    mysql_select_db("notasgest",$connectDB);
        
        
    $sql mysql_query("INSERT INTO alunosso (numero,apelido,nome,curso,email,n_telefone) VALUES('$numero','$apelido','$nome','$curso','$email','$n_telefone')");
    ?>
    Completando a explicação do Baderous.

    Cumps ;)
     
  4. é isso mas tens de tratar os dados 1º senao tens ai uma falha de segurança grave para um SQL inject attack. wiki: en.wikipedia.org/wiki/SQL_injection , e convém principiar cedo com bons hábitos :)
     
    Última edição: 2 de Março de 2009
  5. Sa[n]dman

    Sa[n]dman Power Member

    já agora, podes fazer um resumo sobre o que é o SQL_Injection?
    Não tenho tempo de ler a wiki agora, mas prometo que leio depois, só quero saber se é para evitar erros de programação, problemas de hacking ou outra coisa qualquer.

    Cumps
     
  6. Por acaso está bem explicado e simples na wiki, mas o problema consiste em passar as variáveis directamente para uma query sql sem as &quot;limpar&quot; de dados indesejados. por exemplo se alguém em vez de escrever um numero no campo numero, colocasse por exemplo
    PHP:
     ') VALUES('1')&quot;; drop table alunosso; etc.. etcc...  
    ou seja modificava a query sql... isto é particularmente gravissimo se for usado em scripts com acesso ao publico tipo guestbooks etc.. etc... Costumo usare este codigo para limpar as variaveis
    PHP:
     function SQLIJB($value) {      $SQLLixo = array(&quot;\&quot;&quot;, &quot;\\&quot;, &quot;/&quot;, &quot;*&quot;, &quot;'&quot;, &quot;=&quot;, &quot;-&quot;, &quot;#&quot;, &quot;;&quot;, &quot;&quot;, &quot;+&quot;, &quot;%&quot;);     if ($value) { return str_replace($SQLLixo, &quot;&quot;,$value); }     else return; } 
    depois é so passar a variável pela função
    PHP:
     $variavel =  SQLIJB($_POST[&quot;variavel_recebida&quot;]); 
     
    Última edição: 2 de Março de 2009
  7. Sa[n]dman

    Sa[n]dman Power Member

    Ok, obrigado pelo aviso, mas leio isso depois, em casa com tempo, no trabalho não tenho grande tempo para aprofundar este assunto.
    thx e cumps
     
  8. Dei uma vista de olhos nessa tua função. Parece que algo te converteu isso, já agora posto cá a tua versão com algum espaçamento extra.
    PHP:
    function SQLIJB($value) {
        
    $SQLLixo = array("\"""\\""/""*""'""=""-""#"";""+""%");
        if (
    $value) { 
          return 
    str_replace($SQLLixo"",$value); 
        }     
        else return; 
      }
    Até agora só usava a função
    PHP:
    $valor_convertido htmlspecialchars($_POST['campo'], ENT_QUOTES);
    que converte o grupo de [ <, >, &, *aspas*, *plicas* ] mas notei que se poderia usar o Backslash para ataques.

    Pensei em modificar um pouco a tua informação, visto que ela assim apaga logo quaisquer caracteres especiais (por exemplo se isso fosse o texto de um utilizador que o guardou na base-de-dados ele deparava-se que lhe haviam desaparecido certos caracteres). Ponderei em usar Entidades de HTML, assim a informação fica lá, um pouco codificada mas com html_entity_decode() é fácil descodificar:
    PHP:
    function SQLIJB($value) {
        
    $SQLLixo = array("\"""\\""/""*""'""=""-""#"";""<"">""+""%");
        
    $sql_bonito = array("&#34;""&#92;""&#47;""&#42;""&#39;""&#61;""&#45;""&#35;""&#59;""&#60;""&#62;""&#43;""&#37;");
        if (
    $value) { 
          return 
    str_replace($SQLLixo$sql_bonito$value); 
        }     
        else return 
    false
      }
    PS: Até tou a ter problemas com o fórum a tentar escrever as entidades que ele me converte logo as cenas.
     

Partilhar esta Página