AAO Tracker Profile Field su PHPBB

September 14th, 2007 by MP

Oggi si è compiuto un enorme passo avanti sul fronte IPB AAO Tracker Profile Field Mod ed è stato fatto da un ragazzo, BaXaras < baxaras AT hotmail.com >, che ha eseguito il porting della mod da Invision Power Board a PhpBB.

Per maggiori notizie sulla compatibilità e per la guida su come buttar su la mod sul vostro PhpBB vi rimando ovviamente al suo sito internet:

http://baxaras.altervista.org

Complimenti ancora per lo sbattimento e per il porting!

MP

Posted in Mod Invision PB, PHP Guide, News | No Comments »

Aggiornata la mod Ipb Tracker Profile Field

September 10th, 2007 by MP

http://www.mpwebstudio.com/wordpress/?p=10

A seguito di modifiche del tracker ho provveduto ad aggiornare la mod aggiungendo anche il campo {guid} ora non sembra funzionare ma si spera che presto il tracker mostrerà questo valore correlato al nick di gioco (basta che date un occhiata all’HTML del tracker per scoprire che la guid è estrapolabile ma al momento “nascosta”).

A presto.

MP

Posted in News | No Comments »

Rieccomi! Non sono morto!

April 2nd, 2007 by MP

Eheheeheh son passati più di 10 giorni dall’ultimo post ma causa forze maggiori ero impossibilitato a scrivere: andiamo con ordine..

1- Passaggio da Windows a Linux, già ho dovuto cambiare macchina per via delle incompatibilità con la mia Tesi che richiede Apache Tomcat e PostgreSQL che nella versione Windows del contratto che ho sottoscritto non coesistevano: ego, passaggio a Linux obbligato.

2- Il passaggio a Linux ha seuguito a ruota un aggiornamento di tutto (Script e Tesi) ma non ha sortito l’effetto che avrei sperato: la tesi continua a non voler funzionare qui, ma fortunatamente Fabrizio è riuscito a metter su una macchina per me in wwwstud.dsi.unive.it così posso lavorare in remoto (finalmente!)

3- Maxisupermega raduno a Venezia dei RoA, una cosa da paura: Sabato e Domenica 31 Marzo/1 Aprile ubriacata a Jesolo da me e strafogata di carne a Murano a casa di Andre, non so quando riuscirò a riprendermi ma il mal di testa persiste!*

4- Acquisto del pacchetto Silver di TOL con numerosissimi sottodomini! (Urrah!) Tralaltro metterò su foto.mpwebstudio.com, blog.mpwebstudio.com e non può mancare tesi.mpwebstudio.com e beautifier.mpwebstudio.com! Insomma mpwebstudio rulez!


* le foto del raduno possono essere visualizzate su Coppermine http://foto.mpwebstudio.com/Coppermine/ mentre i video sono su YouTube a questo indirizzo: http://www.youtube.com/view_play_list?p=CFFF7B75C3257C15 buona visione!

Posted in News | No Comments »

Ufff… !

March 21st, 2007 by MP

Scrivo solo ora perchè in questi giorni ho avuto un po' di impedimenti: primo fra tutti un quasi-uragano che si è abbattuto nel pomeriggio di ieri sul mio paese che ha seminato un paio di strati di grandine grande quanto caramelle. Dopo la grandine? Le cavallette!??! NO PEGGIO!!! POSTGRECAZZO!

Ve lo dico in confidenza, io ODIO posgreSQL, odio quell'elefante del cazzo, odio la sua installazione!!!!!!!!!! Il mio è stato odio a prima vista: necessito di lavorare con post(grrrrrrrr)e per via della tesi, sembra che sia uno dei DBMS che permettono di effettuare delle query geometriche o pseudotali... ma è terribilmente UNA ROTTURA DI MARONI!

Non ho ricordi di un programma che ho faticato cosi tanto ad installare, in confronto Beryl 2 su XGL ed ati è stata na cazzata!

I problemi iniziarono subito, tentai di installarlo in un pc con FAT.....ma lui voleva NTFS! Misi NTFS ma lui voleva un utente (postgres) dedicato a lui (un po' come l'ASP.NET machine...altra in-utilità) e glielo feci. Nonostante ciò lui, lui...lui non si volle installare!

Cambiai pc, finalmente riuscii ad installarlo e sembrava funzionare ma per configurarlo mi ci è voluta mezza giornata per colpa del file di configurazione degli accessi (tipo l'.htaccess di apache) che non mi voleva far accedere il portatile in remoto al pc fisso...

Terminati questi problemi sembrava che il nostro idillio d'amore fosse destinato a continuare senza intoppi ma qualcosa non partiva: avevo bisogno di un server remoto di postgreSQL qualcuno che me lo tenesse su tutto il giorno, tutti i giorni [nel senso di postgre!]

Fortunatamente c'è TOL! IL MIO FANTASTICO PROVIDER! Tol ha tutto: MySQL, Apache, PHP, IIS, JDK 1.5, MSSql, la macchinetta del caffè e TOMCAT! Infatti aveva anche PostgreSql...MA.... su Linux (e con JDK 1.4)...

Il mio contratto (Plesk Win) è su windows per cui dovrei passare a Linux (circa un 30 beuri) ma la cosa che mi seccava di più era perdere il database MySQL (che apprezzo molto più di posgtre)! Già perchè il mio contratto mi consente di avere un solo database di tipo MySQL o Postgre [da ora in poi posgre]. Quindi o bacia questo Cristo o salta questo fosso. E io me ne frego sia del Cristo e sia del fosso!

Fortunatamente ho un altro dominio, di tipo linux su TOL: sposto il db mysql di questo dominio nel mio sito, metto su un db postgreSQL e sembra fatta! Configuro tutto, carico il db della tesi con i punti da stampare sulla mappa, provo a connettermi dal mio dominio mpwebstudio ma....

JAVA:
org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "217.73.236.40", user "test", database "tesi", SSL off

quindi il Cristo (che non è scemo da lasciare l'hba.conf scoperto) me l'ha fatta! E a sto punto mi affido alle mani di TOL sperando che se passo a Linux e acquisto il pacchetto gold (per la modica cifra di 0.80 € al mese) riesco ad avere sia il db MySQL e sia il db PosgreSQL per portare avanti sta tesi.

Altrimenti mi tocca andare ad elemosinare al CED un buco su wwwstud.dsi.unive.it dove buttar su sta tesi..

Mi sento un po' come se dovessi sbarazzarmi di un cadavere....

Ricordate diffidate sempre dagli elefanti azzurri!!!!!!!

Mp

Posted in Myself! | No Comments »

IPB Mod #1: Tracker e info

March 18th, 2007 by MP

Risultato:

Link attivo:

http://www.roaclan.net/index.php?showtopic=980

Questa mod funziona su:

  • Invision Power Board 2.1.x
  • Invision Power Board 2.2.x
  • Invision Power Board 2.3.x

Se hai PhpBB continua qui.

Questa mod NON funziona su:

  • Invision Power Board 1.3.x

Questa mod NON è installabile su:

  • Forumfree
  • Forumcommunity

Requisiti per l'installazione:

  • Accesso ftp allo spazio web in cui contenete gli script di invision
  • Possibilità di creare directory nel vostro spazio web
  • Possibilità di scrivere all'interno di una directory del vostro server [fopen() con wb]
  • Possibilità di usare fopen() per aprire destinazioni remote

Passo 1: Creazione del campo Tracker Id

Per prima cosa bisogna creare un Custom Profile Field dal vostro pannello di controllo di Invision e nominarlo Tracker Id quindi dalla sezione Management vi spostate utilizzando il menu situato a sinistra in Custom Profile Fields.

Compilate i campi in questo modo:

  • Field Title Tracker Id
  • Description Inserisci qui il tuo ID Del tracker
  • Field Type Text Input
  • Maximun Input 7
  • Display Order 0
  • Expected input format [Scegliete voi se metterlo o no, perchè può dare problemi] nnnnnnnnn
  • Option Content (for drop downs) Lasciate il campo vuoto
  • Include on registration Page Yes
  • Field MUST be completed and not left empty? No
  • Field can be edited by the member? Yes
  • Make this a private profile field? No
  • Make Admin and Super Moderator Editable/Viewable Only? No

NOTA: il campo Field Title deve essere compilato esattamente con Tracker Id altrimenti non vi funzionerà la mod!
Per ciò che riguarda l'ultimo campo (Topic View Format?) inserite questo codice html che comparirà al di sotto della scheda/avatar utente. Questo HTML è ottimizzato per una skin scura quindi se siete in possesso di una skin chiara cambiate i colori ovviamente agendo nell'html. Tralaltro se vi interessa togliere delle informazioni che non ritenete necessarie potete rimuovere una o più righe:

HTML:
And i'm so skilled »<br><br>

<strong><a href="http://www.aaotracker.com/usertracker.php?userid={content}"><span style="color:#039fe2">{nick}</span></a> </strong><br><span style="color:#9b9b9b">{rank}</span><br>
<img src="http://aaotracker.com/Images/stars/{stars}.gif">
<br><br>
Honor: <strong>{honor}</strong><br>
Fragrate: <span style="color:#99FFFF"><strong>{fragrate}</strong></span><br>
Activity: <span style='color:#FF3366'><strong>{activity} %</strong></span><br>

Popularity: <span style='color:#00FF33'><strong>{popularity} %</strong></span><br>

Experience: <span style='color:#33CCFF'><strong>{experience} %</strong></span><br>
<br>

Next Honor: <span style='color:#FFCC99'><strong>{nexthonor} %</strong></span><br><br>
I pwnd  <span style='color:#99CC66'><strong>{kills}</strong></span> n00bz <br />
I rosik <span style='color:#FF99CC'><strong>{kia}</strong></span> times<br />
ROE: A lot...<br />
<br>
Actually i'm <a href="http://www.aaotracker.com/usertracker.php?userid={content}"> <img border="0" src="http://www.aaotracker.com/trackericon.php?userid={content}&style=6"></a><br /><br></strong><span style="color:#9b9b9b">Last update {updated}<br>{status}</span><br>

Le variabili utilizzate (quelle comprese tra graffe) verranno sostituite con le informazioni prelevate dal tracker e sono:

  • {title} verrà sostituito con "Tracker Id"
  • {content} verrà sostituito con l'id tracker dell'utente
  • {rank} verrà sostituito con il rank dell'utente (Seargent/Major/General/Recruit...)
  • {stars} verrà sostituito con il nome dell'immagine che rappresenta le stelline dell'utente [senza il suffisso .gif]
  • {nick} verrà sostituito con il nick di gioco dell'utente
  • {guid} verrà sostituito con la guid dell'account
  • {kills} verrà sostituito con il numero delle kills dell'utente
  • {kia} verrà sostituito con il numero delle kia dell'utente
  • {honor} verrà sostituito con l'honor dell'utente
  • {nexthonor} verrà sostituito con la percentuale senza '%' del completamento dell'honor successivo dell'utente
  • {fragrate} verrà sostituito con il fragrate dell'utente
  • {activity} verrà sostituito con la percentuale senza '%' dell'activity dell'utente
  • {popularity} verrà sostituito con la percentuale senza '%' del popularity dell'utente
  • {experience} verrà sostituito con la percentuale senza '%' dell'experience dell'utente
  • {longestsession} verrà sostituito con il numero di ore che formano la sessione più lunga dell'utente
  • {bestmap} verrà sostituito con la mappa preferita dell'utente
  • {updated} verrà sostituito con l'ora e la data dell'ultimo aggiornamento delle informazioni del tracker
  • {status} verrà sostituito con "Stat cache Created!" quando si creerà per la prima volta il profilo utente o "Stat cache Updated!" quando si aggiorneranno le statistiche

Al termine delle modifiche dovreste trovarvi davanti ad una situazione come questa:

Se provate a registrar un utente di prova vedrete che comparirà il campo "Tracker Id".

Passo 2: Creazione delle directory per la cache del tracker

Come potete ben immaginare se attingessimo al sito del tracker in continuazione il sito diventerebbe impraticabile vista la lentezza con cui fopen accede al tracker: dobbiamo quindi creare una cache locale in cui salvare una volta al giorno tutte le pagine dei profili degli utenti iscritti.

NOTA: L'ggiornamento viene fatto automaticamente una volta al giorno e se il tracker non fosse disponibile in quel momento o se l'utente avesse il profilo privato apparirà una scritta con "Informazioni del tracker non disponibili! L'utente potrebbe avere il profilo privato o il tracker non è momentaneamente disponibile!" e bisognerà aspettare 24 ore perchè si aggiorni nuovamente il profilo del tracker.

Tornando alla creazione delle directory, attraverso il vostro client ftp andate sulla root in cui avete installato invision e spostatevi nella cartella cache. A questo punto create una cartella di nome profiles e successivamente se siete in un server linux utilizzate il comando CHMOD e con permessi 777 per assegnare i diritti allo script di scrivere all'interno. Se possedete un server Windows allora saltate quest'ultimo passo in quanto il comando CHMOD non è riconosciuto.

A questo punto avete completato la parte relativa alla creazione delle directory, passiamo a quella più difficile: la modifica dei files di invision.

Passo 3: Modifica dei files php di invision

Il nostro file da modificare è class_custom_fields.php situato in questo percorso

root di invision /sources/classes/class_custom_fields.php

Apritelo con il vostro editor preferito (io uso Dreamweaver ma non perchè sono sborone ma perchè mi piace vedere il codice bello colorato) e recatevi più o meno alla linea 490. Dovreste essere nei pressi della funzione method_format_field_for_topic_view( $i ) giusto? Se non siete lì pazienza, cercatela e recatevi al più presto non ho mica tempo da perdere io qui!!!! :P

Ora questo è quello che dovete avere sotto agli occhi per continuare

PHP:
/*-------------------------------------------------------------------------*/
    // Method: format_field_for_topic_view
    /*-------------------------------------------------------------------------*/
   
    function method_format_field_for_topic_view( $i )
    {
        $out = $this->out_fields[$i];
       
        $tmp = $this->cache_data[$i]['pf_topic_format'];
       
        $tmp = str_replace( '{title}'  , $this->field_names[$i], $tmp );
        $tmp = str_replace( '{key}'    , $this->out_chosen[$i] , $tmp );
        $tmp = str_replace( '{content}', $out                  , $tmp );
       
        return $tmp;
    }

Ora sostituite questa funzione (SOLO QUESTA!) con questa:

PHP:
/*-------------------------------------------------------------------------*/
    // Method: format_field_for_topic_view
    /*-------------------------------------------------------------------------*/
   
    function method_format_field_for_topic_view( $i )
    {
        $out = $this->out_fields[$i];
       
        $tmp = $this->cache_data[$i]['pf_topic_format'];
       
        $tmp = str_replace( '{title}'  , $this->field_names[$i], $tmp );
        $tmp = str_replace( '{key}'    , $this->out_chosen[$i] , $tmp );
        $tmp = str_replace( '{content}', $out                  , $tmp );
       
        if($this->field_names[$i] == "Tracker Id")
             $tmp = $this->get_external($tmp,$out);
       
        return $tmp;
    }

In pratica ho aggiunto solamente due righe per riconoscere il campo "tracker id" in modo tale da applicare lo script di riconoscimento tracker solo a quel campo lì e non agli altri.

Aggiungete successivamente al termine di questo script [esattamente tra la funzione method_format_field_for_topic_view( $i ) che avete appena modificato e method_format_content_for_save( $c ) che è la successiva] questa funzione:

PHP:
function get_external($tmp,$trackerid) {
   
   // set a variable
   $contents = "";
   $filename = "./cache/profiles/profile_".$trackerid.".bk";
   $status = "";
   
   //Cache per evitare l'accesso al tracker in continuazione
   if (file_exists($filename)) {
     if(date("Y-m-d", filemtime($filename)) != date("Y-m-d")) {
            //Aggiorno
           // echo "Update!";
           $status = "Stat cache Updated!";
           $handle = fopen("http://aaotracker.com/usertracker.php?userid=".$trackerid, "rb");
           $handle2 = fopen($filename,"wb");
           // Get the info into array.
           while (!feof($handle)) {
               $sout = fread($handle, round(8*1024));
               $contents.=$sout;
               fwrite($handle2, $sout, round(8*1024));
           }
           fclose($handle);
           fclose($handle2);
        } else {
            // echo "Non serviva update!";
            $handle = fopen($filename,"rb");
            while (!feof($handle)) {
                 $contents.= fread($handle, round(8*1024));
            }
            fclose($handle);
        }
   } else {
        // echo "Creo il file!";
        $status = "Stat cache Created!";
        $handle = fopen("http://aaotracker.com/usertracker.php?userid=".$trackerid, "rb");
        $handle2 = fopen($filename,"w+b");
        while (!feof($handle)) {
             $sout = fread($handle, round(8*1024));
             $contents.= $sout;
             fwrite($handle2, $sout, round(8*1024));
         }
      fclose($handle);
      fclose($handle2);
    }
   
   $tmp = str_replace( '{status}'$status      , $tmp );
   $tmp = str_replace('{updated}', date("d/m g:i a", filemtime($filename)), $tmp);
   
   preg_match_all("|size=\"2\"><a title=\"PBGUID:(.*)</a>|U", $contents, $out_nick, PREG_PATTERN_ORDER);
   preg_match_all("|size=\"2\">(.*)</font></td>|U", $contents, $out, PREG_PATTERN_ORDER);

   list($guid,$nick) = split("\">",$out_nick[1][0]);
   
   if($nick == "") {
     $tmp = "<br><br>Informazioni del tracker non disponibili!<br>L'utente potrebbe avere il profilo privato o il tracker non è momentaneamente disponibile!";
        return $tmp;
    }
   
   $tmp = str_replace( '{nick}', $nick   , $tmp );
   $tmp = str_replace( '{guid}', $guid   , $tmp );
   $tmp = str_replace( '{rank}', $out[1][3]   , $tmp );
   $tmp = str_replace( '{fragrate}'$out[1][17]      , $tmp );
   $tmp = str_replace( '{longestsession}'$out[1][11]      , $tmp );
   $tmp = str_replace( '{kills}'$out[1][13]      , $tmp );
   $tmp = str_replace( '{kia}'$out[1][15]      , $tmp );
   $tmp = str_replace( '{honor}'$out[1][5]      , $tmp );
    preg_match_all("|size=\"2\"><b>(.*)</b></font></td>|U", $contents, $out, PREG_PATTERN_ORDER);
   
    $map = $out[1];
    $bestmap = 5;
   
    for($i = 5; $i <sizeof($map); $i=$i+2)
       if(str_replace(" Hours","",$map[$bestmap]) <str_replace(" Hours","",$map[$i]))
           $bestmap = $i;
           
    $tmp = str_replace( '{bestmap}'$map[$bestmap-1], $tmp);
       
       
   preg_match_all("|: (.+)%|U", $contents, $out, PREG_PATTERN_ORDER);
   
   $tmp = str_replace( '{activity}'$out[1][0]      , $tmp );
   $tmp = str_replace( '{popularity}'$out[1][1]      , $tmp );
   $tmp = str_replace( '{experience}'$out[1][2]      , $tmp );
   $tmp = str_replace( '{nexthonor}'$out[1][3]      , $tmp );
           
   preg_match_all("|Images/stars/(.*)\.gif|U", $contents, $out, PREG_PATTERN_ORDER);
   
   $tmp = str_replace( '{stars}'$out[1][0]      , $tmp );
   
    return $tmp;
  }

Una volta aggiunta questa funzione salvate il file class_custom_fields.php create un backup el precedente e uppatelo nella directory classes.

Se in qualche modo dovesse capitare qualche problema o avete pasticciato con il file php avete due opzioni: caricare il file class_custom_fields.php di backup o tentare di caricare il mio file class_custom_fields.php che trovate qui.

La guida è terminata qui, segue ora un passo per chi dovesse riscontrare problemi:

Passo 4: Aiuto! Ho un problema!
Hai qualche problema?

Mi visualizza una pagina bianca o un messaggio di errore quando tento di visualizzare un post!
Significa che hai pasticciato con il php! In questo caso puoi scegliere di ripristinare il backup del tuo file class_custom_fields.php o di tentare con questo.

Mi visualizza sempre il messaggio Informazioni del tracker non disponibili! anche se il tracker funziona e il mio profilo è pubblico!
In questo caso può essere per vari motivi:

1- Può essere dovuto al fatto che nel momento in cui il profilo del tracker sul tuo forum è stato aggiornato il tracker non era disponibile o tu avevi il profilo privato. Hai la possibilità di scegliere di aspettare un giorno oppure di andare dentro alla cartella cache/profiles e di cancellare il file profile_{tuo id del tracker}.bk.

2- Può essere dovuto al fatto che il tuo server non ti permette di accedere a pagine web da remoto, per verificarlo prova a recarti all'interno della cartella cache/profiles e se la cartella è vuota forse è dovuto a quello.

3- Può essere dovuto al fatto che il tuo server non ti permette di creare file con fopen(), per verificarlo prova a recarti all'interno della cartella cache/profiles e se la cartella è vuota forse è dovuto a quello.

In questi ultimi due casi hai la possibilità di chiedere informazioni al supporto tecnico del tuo dominio o, se sei bravo con php, tentare una configurazione di fopen alternativa [magari con w+ o w+b anzichè wb].

MP

EDIT 10/09/2007: A seguito di modifiche del tracker è stato modificato anche il codice di get_external() per cui siete invitati ad aggiornarlo alla versione corrente.

Posted in Mod Invision PB, PHP Examples, News | 4 Comments »

Sicurezza: SQL Injection

March 16th, 2007 by MP

Quando si parla di php non si può tralasciare l'argomento sicurezza. Essendo uno dei linguaggi di scripting più utilizzati per costruire siti internet dinamici è allo stesso tempo più preso di mira da hackers (per lo più lamers) che sfruttano le vulnerabilità dei siti internet php per eseguire comandi o e impadronirsi del sistema su cui è hostato il sito.

La cosa che fa tremare di più gli sviluppatori di siti internet in PHP non sono gli attacchi DoS o bruteforce ma lo sfruttamento delle sviste degli stessi programmatori!

E' come se un costruttore di automobili si dimenticasse di fissare i cardini sulla portiera delle auto rendendo cosi inutile la serratura!

Queste sviste purtroppo non sono sempre lampanti sopratutto negli script di svariate migliaia di linee di codice e anche i programmatori senior spesso cadono in questo genere di errori.

Ma se una persona comune pensa che una svista potrebbe permettere di inserire in un campo una data di nascita fasulla (come ad esempio 31/2/1984), per altri programmatori significa ben altro. Ad esempio la possibilità di inserire dei comandi particolari che in determinati casi (molto raramente) possono essere eseguiti creando anche pieno accesso alle directory e ai files del sito.

Stiamo parlando dell'SQL Injection, una tecnica particolare che combina lo sfruttamento di vulnerabilità nei campi di inserimento allo scopo di far eseguire dei comandi SQL.

Per spiegare questo concetto immaginatevi un form, come quello di google. Se google avesse un database e ogni ricerca effettuata da qualsiasi utente venisse salvata nel database allora ci troveremo di fronte ad uno script del genere:

PHP:
<?php

$query = "INSERT INTO queries (query) VALUES ('".$_POST["ricerca"]."')";

mysql_query($query);

?>

Ovviamente questo è uno script da polli, ma molto spesso capita di trovare degli script simili: daltronde chi si aspetta che qualcuno inserisca nel campo della ricerca parametri SQL?

Continuando il discorso ipotizziamo l'inserimento nel form di richiesta una stringa tipo:

SQL:
');INSERT INTO administrators (name,password) VALUES ('mp','mp

In questo caso inseriremmo nel database nella tabella administrators il nostro nome cosicchè da poter accedere ad un ipotetico pannello di controllo di google.

Naturalmente questo è un esempio che è semi fantascienza, ma vi fa capire che basta poco per lasciare aperta una possibilità di inserire all'interno del vostro database informazioni non autorizzate e lasciando cosi spazio a qualche bontempone che vi vuole fare una sorpresa.

Un altro esempio di sql injection è l'esempio classico dal form di login: immaginiamo un form di login di questo tipo:

HTML:
<form action='login.php' method='post'>
   Utente <input type='text' name='user' />
   Password <input type='password' name='pass' />
   <input type='submit'/>
</form>

Ne avete visti/fatti a centinaia, che succede però nella parte del server, cioè come gestiamo le informazioni mandate nel form? Beh se siamo un po' spavaldi e non ci curiamo della sicurezza...così

PHP:
<?php

$query = "SELECT * FROM users WHERE user='".$_POST["user"]."' AND pwd='".$_POST["pass"]."'";
$result= mysql_query($query);

?>

Naturalmente è uno script valido e funzionante, quindi che succederebbe se noi volessimo utilizzare una stringa SQL come nome utente "administrator" e password "boh' OR '1'='1"? La query che ne risulterà sarà:

SQL:
SELECT * FROM users WHERE user='administrator' AND pass='boh' OR '1'='1'

Siccome nella query è presente OR 1=1 allora la query darà il primo risultato cioè quello sperato da chi si collega con i dati corretti perchè anche se la password è sbagliata, 1=1 è vera perciò si verrà autenticati da amministratori.

Spero che questo post vi serva per creare codice più robusto ed evitare che un piccolo errore di valutazione possa causare danni grossisimi.

MP

Posted in PHP Security | 2 Comments »

Problemi di connessione?? Forse è colpa dei DNS…

March 16th, 2007 by MP

In questo ultimo periodo (da Dicembre 2006) nel Nord Italia si sono susseguite numerosissime segnalazioni di navigazione lenta/interrotta/a singhiozzo che non avevano come origine la connessione ad internet ma la vera e propria navigazione: sembrava che i siti internet non ci fossero quando realmente c'erano anche se la connessione ad internet funzionava egregiamente. Poteva capitare cioè di scaricare un file a 400 KB/s e non riuscire ad aprire pagine come GOOGLE o Repubblica.it.

E questo avveniva anche per la posta elettronica e tutti i programmi che necessitavano di risolvere un particolare dominio.

Infatti con gli IP questo problema non si verificava, cioè se anzichè scrivere www.google.it avessimo scritto 216.239.37.99, il sito si apriva tranquillamente senza messaggi come "Impossibile visualizzare la pagina".

Il problema sta chiaramente nella cache dei server DNS utilizzati dai provider, in particolare i più colpiti da questi disservizi sono gli utenti ADSL di Alice/Tin.it che utilizzano dei server DNS con qualche particolare impedimento che non permette il funzionamento a dovere.

Questa situazione in principio non era fastidiosa ma alla lunga è diventata stressante tanto che mi sono impuntato nel trovare una soluzione: dopo aver verificato che la mia linea era perfettamente funzionante e non sussistevano problematiche tecniche sulla mia portante, ho cercato un provider dns che mi potesse garantire la navigazione e l'ho trovato in OpenDNS

Free Image Hosting at www.ImageShack.us

OpenDNS (www.opendns.com) permette di sfruttare due Server DNS messi a disposizione gratuitamente da questa società che sono

  1. 208.67.222.222
  2. 208.67.220.220

Nel loro sito viene illustrato per ogni tipo di interfaccia di rete utilizzata per collegarsi ad internet, il modo con cui si possono sostituire i DNS forniti dall'ISP con i loro DNS. Nel mio caso, un router-modem ap Netgear, mi è stato sufficiente entrare nel pannello di amministrazione e impostare i due DNS.

OpenDNS se vi registrate vi offre la possibilità monitorare l'utilizzo della vostra ADSL.

MP

Posted in Adsl & dintorni | No Comments »

Aggiornato il Tournament Result Beautifier!

March 14th, 2007 by MP

Aggiornata la 0.3c del tournament result beautifier e portata alla 0.4:

  • Sistemati i link "indietro" nelle pagine che non funzionavano con Mozilla e Safari
  • Sistemati i bookmark, ovvero i link al sito della Federazione Italiana A.A. e alla ligaa e aggiunto un link al mio guestbook :)
  • Sistemati alcuni piccoli bug che ci metterei troppo tempo a scrivere, vi basta sapere che nei report di pareggio non scompare più il nome di una squadra (evvivaaaa!)

Posted in News | No Comments »

Un print_r() meglio formattato!

March 14th, 2007 by MP

Quante volte vi è toccato stampare totalmente un oggetto o un array perchè non vi tornavano i conti perchè ad esempio il contenuto di una variabile era diverso da quello che vi aspettavate? E quante volte ancora lo avete fatto usando print_r()?

Se la vostra risposta è molte probabilmente troverete utile questo post: come sapete bene print_r è già molto per chi non ha tempo da perdere e necessita di debug veloci e particolarmente chiari. Print_r() è discretamente chiaro ma si può fare di meglio. L'output di print_r è formattato per essere letto testualmente, in una pagina html il risultato non è totalmente apprezzabile anzi è un po' una schifezza. Come ovviare a ciò? Modificare l'output di print_r() con una funzione per sostituire tutti gli spazi generati da print_r() con &nbsp; e i ritorno a capo (\n) con <br>.

La funzione che ci può servire è questa:

PHP:
<?php

function print_r_html($obj) {
     echo "<pre>".str_replace(array("\n" , " "), array("<br>", "&nbsp;"), print_r($obj, true))."</pre>";
}

?>

MP

Posted in PHP Tip/Tricks | No Comments »

Stack, vettori o semplicemente array…

March 13th, 2007 by MP

Apro questo piccolo spazio con un introduzione abbastanza veloce sul mondo dei vettori (che io amo chiamare array). Personalmente io li uso moltissimo (anzi ne abuso) perchè in php, a differenza di java e del c, hanno numerose caratteristiche interessanti... spero che alla fine direte cazzo figata!

Partiamo con un po' di teoria (buuuuuuuuuh), con vettore si intende una collezione di variabili a cui si accede attraverso un particolare valore chiamato indice che permette di utilizzare la variabile a lui associata. La potenza degli array in PHP è che ogni singola variabile può essere di tipo diverso dalle altre presenti nella collezione in parole povere possiamo inserire in un unico array stringhe, numeri interi, valori con virgola, oggetti e altri array...
Cosa che se stessimo lavorando con c farebbe rizzare i capelli in testa al compilatore...

Passiamo ora nel tecnico (urrah!): ad esmpio se volessimo rappresentare con l'aiuto di php la nostra lista di canzoni..

PHP:
<?php

$mya = array("Toto - Africa","Duran Duran - Save a prayer","Cristina D'avena - Pollon");

?>

Abbiamo (ho) creato un piccolo array di tre elementi di nome "$mya". Per i più ho scoperto l'acqua calda, per altri invece si è aperto un nuovo mondo. In pratica $myarray conterrà tre variabili che a loro volta conterranno ognuna un nome di canzone. La domanda qui sorge spontanea: come faccio ad accedere ad ogni singola variabile?

PHP:
<?php

echo "Mi piacciono i cartoni animati perchè ascolto ".$mya[2];

?>

In questo modo stamperò "mi piacciono i cartoni animati perchè ascolto Cristina D'avena - Pollon"

L'indice di associazione parte da 0 perciò se ho un array di n elementi l'ultimo elemento sarà l'(n-1)-esimo e non l'n-esimo come si potrebbe pensare.

Php eredita dal c la notazione a parentesi quadre per rappresentare l'indice di un array, cosa che visual basic non fa utilizzando semplicemente le parentesi tonde e generando un po' di confusione scambiando talvolta array con funzioni.

Le potenzialità degli array sono ancora tutte da scoprire: abbiamo visto indici numerici ma cosa succede se scriviamo:

PHP:
<?php

$mya = array(     "Rock"     => "Boston",
                  "Classica" => "Mozart",
                  "Dance"    => "Planet Funk",
                  "Punk"     => "korn");

print_r($mya);

?>

In questo caso ho inizializzato un array utilizzando degli indici personali che non sono numerici....ma bensì stringhe... una cosa che può risultare assurda anche a chi conosce linguaggi di programmazione come c o java. In php è possibile utilizzare oltre che formati numerici anche stringhe per rappresentare gli indici.

La funzione print_r($mya) permette di stampare l'array in formato apprezzabile (cioè ben formattato) visto che per stampare un array ci vuole un for particolare...che illustrerò nei prossimi post!

mp

Posted in PHP Guide | 1 Comment »

« Previous Entries