• User

    Modifica informazioni personali script php

    Buon giorno a tutti!
    Ho installato nel mio sito uno script in php senza problemi. Facendo però delle simulazioni di funzionamento mi sono reso conto che ci sono degli errori proprio di comportamento del programma.
    Premetto che si tratta di un programma che prevede da parte dell'utente la compilazione di un form di iscrizione con inserimento di un proprio ID e una propria PW. Dopo l'operazione di "login" si accede ad una pagina personale dove tra le altre cose c'è la possibilità di modificare le proprie informazioni personali. Uno degli errori è che non registra le informazioni personali modificate.
    Io non sono pratico di php, vi posto quindi tutto il file; capisco che è molto lungo ma non saprei quali parti eliminare.
    Ringrazio chi può darmi una mano

    <?php
    session_start();
    session_register("id_session");
    session_register("password_session");
    include "header.php";

    $id=$_SESSION["id_session"];
    $password=$_SESSION["password_session"];
    if ($id=="" && $password=="")
    {

    ?>

    <form action=members.php method=post>
    <br><br><Center><table><tr><td colspan=2 align=center><h3>Login Area Membri</h3></td></tr>
    <tr><td>ID Membro</td><td><input type=text name=id></td></tr>
    <tr><td>Password</td><td><input type=password name=password></td></tr>
    <tr><td> </td><td>
    <a href="forgot.php" onclick="doexit=false;"><font face="Verdana,Arial,Helvetica" size="1" color="#000000"><b>Hai Dimenticato La Password?</b></font></a></td></tr>
    <tr><td colspan=2 align=center><input type=submit value="Log In"></td></tr>
    </table></form>

    <? }
    else
    {

    if (!$_POST)
    {
    middle();
    }

    elseif ($_POST["fname"]!="" && $_POST["add"]!="" && $_POST["city"]!="" && $_POST["state"]!="" && $_POST["country"]!="" && $_POST["pzcode"]!="" && $_POST["pwd"]!="")

    {
    if($password==$_POST["pwd"])
    {

    print "<center><b>Il tuo Account e' stato aggiornato con successo<br></b></center>";
    $id=$_SESSION["id_session"];
    $rs = mysql_query("select * from members where ID=$id");
    $arr=mysql_fetch_array($rs);
    $check=0;

    $check=1;
    $db_field[1]=$_POST["fname"];
    $db_field[2]=$_POST["add"];
    $db_field[3]=$_POST["city"];
    $db_field[4]=$_POST["state"];
    $db_field[5]=$_POST["pzcode"];
    $db_field[6]=$_POST["country"];
    $query="update members set Name='$db_field[1]', Address='$db_field[2]', City='$db_field[3]', State='$db_field[4]', Zip='$db_field[5]', Country='$db_field[6]' where ID=$db_field[0]";
    $rs = mysql_query($query);
    }
    else
    {
    print "<center><b>Password Non Valida! Il tuo Account non puo' essere aggiornato!<br></b></center>";
    }

    middle();
    }

    }
    ?>

    <br><br>
    <? include "footer.php";
    function middle()
    {
    include "config.php";
    $id=$_SESSION["id_session"];
    $rs = mysql_query("select * from members where ID=$id");
    $arr=mysql_fetch_array($rs);
    $name=$arr['Name'];
    $address=$arr['Address'];
    $city=$arr['City'];
    $state=$arr['State'];
    $zip=$arr['Zip'];
    $country=$arr['Country'];
    $password=$arr['Password'];
    $email=$arr['Email'];

    ?>
    <table border="0" width="650">
    <tr>
    <td width="150" valign="top">
    <table width="140">
    <tr>
    <td align="left"><br><br><br><br>
    <ul><font face="verdana" size="1">
    <a href="stats.php">Statistiche</a><br><br>
    <a href="update_pf.php">Modifica Le Informazioni Personali</a><br><br>
    <a href="sample_e.php">Codice Referral & Links</a><br><br>
    <a href="logout.php">Logout</a><br><br>
    </td></tr></table>
    </td>
    <td VALIGN="top">
    <form method="post" action="update_pf.php">
    <table width="400" border="1" cellspacing="0" cellpadding="0" align="center">
    <tr align="center" valign="middle" bgcolor="#FFFFFF">
    <td colspan="2"><b>Aggiorna le tue Informazioni Personali</b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">NOME
    COMPLETO*</font></b></td>
    <td width="56%" height="40" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="fname" size="20" maxlength="40" value="<? echo $name; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" height="18" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">INDIRIZZO
    E-MAIL* </font></b></td>
    <td width="56%" height="40" bgcolor="#FFFFFF" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <? echo $email; ?>
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" height="18" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">INDIRIZZO*</font></b></td>
    <td width="56%" bgcolor="#FFFFFF" height="40" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="add" value="<? echo $address; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">CITTA'</font></b></td>
    <td width="56%" bgcolor="#FFFFFF" height="40" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="city" size="15" maxlength="30" value="<? echo $city; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td height="18" width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">STATO
    </font></b></td>
    <td height="40" width="56%" bgcolor="#FFFFFF" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="state" size="15" maxlength="30" value="<? echo $state; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td height="18" width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">PROVINCIA*</font></b></td>
    <td bgcolor="#FFFFFF" height="40" width="56%" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="country" size="15" maxlength="30" value="<? echo $country; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">
    CODICE POSTALE*</font></b></td>
    <td bgcolor="#FFFFFF" width="56%" height="40" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="text" name="pzcode" size="10" maxlength="20" value="<? echo $zip; ?>">
    </font></b></td>
    </tr>
    <tr align="left" valign="middle">
    <td width="44%" bgcolor="#FFFFFF"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="1">PASSWORD*
    </font></b></td>
    <td bgcolor="#FFFFFF" width="56%" height="40" align="left"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="password" name="pwd" size="20" maxlength="40">
    </font></b></td>
    </tr>
    <tr align="center" valign="middle">
    <td colspan="2" height="40" bgcolor="#FFFFFF"><b></b><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
    <input type="submit" value="Aggiorna">

    </font></b></td>
    </tr>
    </table>
    </form>
    </td>
    </tr>
    </table>
    <? return 1;
    }

    ?>


  • User

    Prova a cambiare questa riga

    [PHP]$query="update members set Name='$db_field[1]', Address='$db_field[2]', City='$db_field[3]', State='$db_field[4]', Zip='$db_field[5]', Country='$db_field[6]' where ID=$db_field[0]";[/PHP]

    in

    [PHP]$query="update members set Name='$db_field[1]', Address='$db_field[2]', City='$db_field[3]', State='$db_field[4]', Zip='$db_field[5]', Country='$db_field[6]' where ID=".intval($id);[/PHP]

    In ogni caso, oltre ad essere parecchio confuso, il codice sembra avere diversi problemi di sicurezza


  • User

    ciao gan
    ti ringrazio per la collaborazione, ho risolto questo questo problema con la tua indicazione. Hai detto che nel file hai riscontrato dei problemi di sicurezza, che cosa intendi?
    grazie


  • User

    Il codice che hai postato può essere utilizzato per eseguire query arbitrarie

    Per approfondire puoi dare un'occhiata a questa pagina
    it.wikipedia.org/wiki/SQL_injection


  • User

    interessante.... lo script che ho installato l'ho acquistato qualche tempo fa e funziona in questo modo: all'atto dell'iscrizione da parte di un utente si riceve un ID e una PW. Tramite questi si accede in una pagina personale dove vi è la possibilità di scaricare prodotti digitali, che io, come amministratore posso inserire. Al programma è applicato un sistema a matrice forzata 4X10. Ammettiamo che io abbia ID=1 e tramite un link personale generato all'atto dell'adesione faccia iscrivere un utente "ID=2".
    A questo punto "ID=2" verrebbe posizionato dal programma al mio 1° livello inferiore.
    Ammettiamo ora che "ID=2" a sua volta inserisca "ID=3".
    A questo punto "ID=3" verrebbe posizionato al mio 2° livello inferiore e così via.
    Questo appunto dovrebbe avvenire correttamente, invece anche "id=3" mi viene posizionato al 1° livello inferiore.
    La mia spiegazione è stata un pò contorta ma spero di essermi fatto capire bene.
    Ora non so se questo errore sia dovuto a qualche errore di programmazione o se dipenda dal database.
    Che ne pensi?
    grazie


  • User

    Senza ulteriori dettagli è difficile da capire, credo sia un errore di programmazione.

    In ogni caso considera che se tutte le query sono fatte in quel modo esiste una possibilità concreta che sia possibile forzare la verifica e scaricare i prodotti digitali assegnati ad altri utenti.


  • User

    esiste qualche modo per potersi proteggere da questo?
    se posto il file con la programmazione della matrice ci puoi dare uno sguardo?
    grazie


  • User

    Postalo pure, sperando che il codice non sia troppo confuso 🙂


  • User

    ti ringrazio 🙂
    intanto nel file config.php oltre ai dati di accesso per il database c'è questo che non so se può ritornarti utile

    //Don't change the below 2 lines
    $dbconnect=mysql_connect($dbhost,$dbuser,$dbpass);
    mysql_select_db($dbname);

    $rs=mysql_query("select * from adminsettings");
    if(mysql_num_rows($rs)>0) {
    $arr=mysql_fetch_array($rs);
    $sitename=$arr[0];
    $siteurl=$arr[1];
    $webmasteremail=$arr[2];
    $adminpass=$arr[3];

    $alertpay=$arr[4];

    $fee=$arr[7];

    $levels=$arr[8];

    $level1=$arr[9];
    $level2=$arr[10];
    $level3=$arr[11];
    $level4=$arr[12];
    $level5=$arr[13];
    $level6=$arr[14];
    $level7=$arr[15];
    $level8=$arr[16];
    $level9=$arr[17];
    $level10=$arr[18];

    $forcedmatrix=$arr[19];
    $membershipperiod=$arr[20];
    $signupbonus=$arr[21];
    }

    Per quanto riguarda il file per la matrice credo si trovi nel file members.php;
    io provo a postartelo tutto perchè non saprei estrapolare la parte che realmente possa essere utile. Purtroppo e molto lungo e ti chiedo scusa in anticipo.

    <?php
    session_start();
    session_register("id_session");
    session_register("password_session");
    include "header.php";
    include "config.php";
    $a="";
    $b="";

    if ($_POST) {
    $a=trim($_POST["id"]);
    $b=trim($_POST["password"]);
    $a=str_replace("'","",$a);
    $b=str_replace("'","",$b);
    $a=str_replace(""","",$a);
    $b=str_replace(""","",$b);

    }
    if ($a=="" || $b=="")
    {

    if ($_SESSION["id_session"]=="" || $_SESSION["password_session"]=="")
    {

    ?>

    <form action=members.php method=post>

    <br><br><Center><table><tr><td colspan=2 align=center><h3>Members Login Area</h3></td></tr>
    <tr><td>Member's ID</td><td><input type=text name=id></td></tr>
    <tr><td>Password</td><td><input type=password name=password></td></tr>
    <tr><td> </td><td>
    <a href="forgot.php" onclick="doexit=false;"><font face="Verdana,Arial,Helvetica" size="1" color="#000000"><b>Forgot Your Password?</b></font></a></td></tr>
    <tr><td colspan=2 align=center><input type=submit value="Log In"></td></tr>
    </table></form>

    <?

    }
    else
    {
    middle();
    }
    }
    else
    {
    $check=0;

    $id=$_POST["id"];
    $rs = mysql_query("select * from members where ID='$id'");

    if ($rs) {
    $arr=mysql_fetch_array($rs);
    $n2=$arr['Password'];
    if ($n2==$b) {
    $check=1;
    $_SESSION["id_session"]=$arr[0];
    $_SESSION["password_session"]=$arr[9];
    middle();
    }
    }
    if ($check==0)
    {
    print "<h2>Invalid User Id or Password</h2>";
    ?>

    <form action=members.php method=post>

    <br><br><Center><table><tr><td colspan=2 align=center><h3>Members Login Area</h3></td></tr>
    <tr><td>Member's ID</td><td><input type=text name=id></td></tr>
    <tr><td>Password</td><td><input type=password name=password></td></tr>
    <tr><td> </td><td>
    <a href="forgot.php" onclick="doexit=false;"><font face="Verdana,Arial,Helvetica" size="1" color="#000000"><b>Forgot Your Password?</b></font></a></td></tr>
    <tr><td colspan=2 align=center><input type=submit value="Log In"></td></tr>
    </table></form>
    <?
    }
    }

    function middle()
    {

    $id=$_SESSION["id_session"];
    $rs = mysql_query("select * from members where ID=$id");
    $arr=mysql_fetch_array($rs);
    $check=1;
    $id=$arr[0];
    $password=$arr[9];
    $name=$arr[1];
    $address=$arr[2];
    $city=$arr[3];
    $state=$arr[4];
    $zip=$arr[5];
    $country=$arr[6];
    $phone=$arr[7];
    $email=$arr[8];
    $password=$b;
    $paymentoption=$arr[10];
    $refby=$arr[11];
    $l1=$arr[12];
    $l2=$arr[13];
    $l3=$arr[14];
    $l4=$arr[15];
    $l5=$arr[16];
    $l6=$arr[17];
    $l7=$arr[18];
    $l8=$arr[19];
    $l9=$arr[20];
    $l10=$arr[21];
    $leader=$arr[22];
    $total=$arr[23];
    $unpaid=$arr[24];
    $paid=$arr[25];

    ?>
    <table border="0" width="650">
    <tr>
    <td width="150" valign="top">
    <table width="140">
    <tr>
    <td align="left"><br><br><br><br>
    <ul><font face="verdana" size="1">
    <a href="stats.php">Statistics</a><br><br>
    <a href="update_pf.php">Edit Personal Information</a><br><br>
    <a href="sample_e.php">Referral Code & Links</a><br><br>
    <a href="logout.php">Logout</a><br><br>

    </td></tr></table>
    </td>
    <td VALIGN="top">
    <table>
    <tr>
    <td>
    <font face="verdana" size="3"><b>
    <p>Account Center</b></font></p>

    <br>
    </td>
    </tr>
    <tr>
    <td>

    <div align="center">
    <table border="0" cellpadding="3" cellspacing="0" width="400">

    	      <tr> 
    	        <td colspan="2"><b>
    	         <hr><font face="Verdana, Arial, Helvetica, sans-serif" size="-1"><center>&nbsp;Account Details for <?echo $name;?></font></center></b><hr>
    	        </td>
    	      </tr>
    	      <tr> 
    	        <td valign="center" align="left"><strong><font face="Verdana" size="-1">Total Commisions Earned: </font></strong><br></td>
    	        <td valign="center"> <font face="Verdana" size="-1">$<? echo $total;?></font><br></td>
    	      </tr>
    	      <tr> 
    	        <td valign="center" align="left"><strong><font face="Verdana" size="-1">Commisions Due: </font></strong><br></td>
    	        <td valign="center"> <font face="Verdana" size="-1">$<? echo $unpaid;?></font><br></td>
    	      </tr>
    	      <tr> 
    	        <td valign="center" align="left"><strong><font face="Verdana" size="-1">Commisions Paid: </font></strong><br></td>
    	        <td valign="center"> <font face="Verdana" size="-1">$<? echo $paid;?></font><br></td>
    	      </tr>
    	      <tr> 
    	        <td valign="center" align="left" colspan=2>&nbsp;</td>
    	      </tr>
    	      <tr> 
    	        <td valign="center" align="left"><strong><font face="Verdana" size="-1">Direct Referrals: </font></strong><br></td>
    	        <td valign="center"> <font face="Verdana" size="-1"><?
    

    $rsd=mysql_query("select * from members where Leader=".$id);
    echo mysql_num_rows($rsd); ?></font><br></td>
    </tr>
    <tr>
    <td valign="center" align="left" colspan=2> </td>
    </tr>
    <tr>
    <td valign="center" align="left" colspan=2><strong><font face="Verdana" size="3">Downline Information </font></strong><br></td>
    </tr>

    	      <tr> 
    	        <td valign="center" align="left"><strong><font face="Verdana" size="-1">Total Downline Size: </font></strong><br></td>
    	        <td valign="center"> <font face="Verdana" size="-1"><?     echo ($l1+$l2+$l3+$l4+$l5+$l6+$l7+$l8+$l9+$l10); ?></font><br></td>
    	      </tr>
    		<tr><td colspan=2>
    
    		<Table width=100%>
    		<tr><td bgcolor=#000000><strong><font face="Verdana" size="-1" color=#ffffff>Level</font></strong></td>
    		<td bgcolor=#000000><strong><font face="Verdana" size="-1" color=#ffffff>Number of Members</font></strong></td>	</tr>
    

    <? include "config.php"; ?>
    <? for($i=1;$i<=$levels;$i++) { ?>
    <tr><td><strong><font face="Verdana" size="-1"><? echo $i; ?></font></strong></td>
    <td ><font face="Verdana" size="-1">
    <?
    if($i==1) {
    echo $l1;
    }
    elseif($i==2) {
    echo $l2;
    }
    elseif($i==3) {
    echo $l3;
    }
    elseif($i==4) {
    echo $l4;
    }
    elseif($i==5) {
    echo $l5;
    }
    elseif($i==6) {
    echo $l6;
    }
    elseif($i==7) {
    echo $l7;
    }
    elseif($i==8) {
    echo $l8;
    }
    elseif($i==9) {
    echo $l9;
    }
    elseif($i==10) {
    echo $l10;
    }
    ?>
    </font></td> </tr>
    <? } ?>
    </table>
    </td></tr>
    <tr><td colspan=4><hr></td><tr>
    </table>
    </div>

    		</td>
    	</tr>
    
    </table>
    		<font face="verdana" size="3"><b>
    		<p>Download Center</b></font></p>
    

    <?
    include "download.php";
    ?>
    </td>
    </tr>
    </table>
    <br><br>
    <?
    }
    include "footer.php";
    ?>


  • User

    Devo darti una brutta notizia 🙂

    Anche il codice che hai postato è passibile di sql injection.

    Cioè tramite il form di login è possibile eseguire query arbitrarie sul database.

    Probabilmente nel file download.php c'è l'algoritmo che verifica se l'utente è autorizzato a scaricare i prodotti digitali. Ma quasi sicuramente si può scavalcare resettando le password tramite il form di login.


  • User

    capisco...... ma quello che ho postato è il file giusto dove è impostato il funzionamento della matrice?


  • User

    Credo sia quello giusto ma senza avere la struttura del database sottomano è molto difficile da capire se il funzionamento è quello atteso visto che chi ha programmato lo script preleva i dati facendo riferimento non al nome del campo ma alla sua posizione nella query (ad esempio vedi i vari $arr[19] etc.etc.).

    In ogni caso, scusa la franchezza, ma credo che il corretto funzionamento della matrice sia l'ultimo dei tuoi problemi.


  • User

    il problema dell'esecuzione delle query arbitrarie sul database può essere risolto in qualche modo? Il problema potrebbe essere un infiltrazione da parte di utenti esterni anche non iscritti?


  • User

    Ti consiglio di contattare l'autore e segnalare il problema. Il problema lo puoi risolvere (come spiegato nella pagina di wikipedia che ti ho linkato) validando l'input ricevuto attraverso il form.

    Oltre all'infiltrazione di utenti esterni qualcuno potrebbe cancellare tutti i tuoi dati, cambiare la password di tutti gli utenti e altri giochetti del genere.


  • User

    Proverò a contattare l'autore dello script o meglio il sito dove l'ho acquistato e cercherò di esporre il problema; spero di riuscirci anche se il sito è in inglese. Se riuscissi comunque a risolvere il problema della matrice per me sarebbe comunque un passo importante. Mi hai detto che senza avere la struttura del database sarebbe difficile capire il funzionamento, ma se te la fornissi riusciresti a venirne a capo?


  • User

    Mi dispiace ma non ho tempo da dedicare a questa cosa