• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
[GUIDA] Login System con WWW
#1
Salve,
durante la realizzazione del mio progetto (a breve un'anteprima), mi sono imbattuto nella creazione di un sistema di autenticazione degli utenti. Dal momento che la prima versione risultava scadente in termini di sicurezza dei dati, dopo qualche ricerca ho trovato un metodo interessante che fa uso della classe WWW.
E' molto facile da comprendere e da realizzare, quindi passo subito al sodo. Wink

La guida fa uso di linguaggi di scripting come il PHP e linguaggi di modellazione dati come l'SQL. Per domande riguardanti tali linguaggi, vi invito a consultare dapprima i link alle varie documentazioni che vi ho allegato sopra e poi a porre qui i vostri dubbi.

Innanzitutto, avremo bisogno di un database e di una tabella. Potete utilizzare qualsiasi DBMS, in questo caso verrà utilizzato MySQL (questo non esclude che voi possiate utilizzarne altri come PostgreSQL, SQLServer, ecc).

Create il vostro database o utilizzatene uno che avete già creato.
Create la vostra tabella che, per semplicità, in questa guida chiamerò "Account".

Codice PHP:
CREATE TABLE `Account` (
`
AccountIDINT(10NOT NULL AUTO_INCREMENT PRIMARY KEY,
`
AccountNameVARCHAR(30NOT NULL,
`
PasswordVARCHAR(50NOT NULL,
`
EmailVARCHAR(50NOT NULL,
`
DataCreazioneDATETIME NOT NULL,
`
StatoAccountVARCHAR(10NOT NULL DEFAULT 'OK',
ENGINE innodb

Personalizzate la tabella come meglio credete, questi sono solo alcuni campi che ho utilizzato io, potete aggiungere molte altre cosette, avendo ovviamente cura di aggiungere eventuali campi aggiuntivi nei vari script.

Abbiamo ora la nostra tabella, la quale conterrà i dati degli account registrati. Inseriamo subito un account:

Codice PHP:
INSERT INTO `Account` ( `AccountName` , `Password`, `Email`, `DataCreazione` )
VALUES 'prova'MD5'prova123' ), 'prova@email.pr'NOW() ); 

Abbiamo così creato un nuovo account che useremo per le nostre prove. Potete, ovviamente, creare qualche pagina PHP per un inserimento più immediato di nuovi account.

Creiamo ora il nostro login in PHP, che conterrà, lontano dagli occhi del client, le informazioni di autenticazione:

Codice PHP:
<?
// <editor-fold defaultstate="collapsed" desc="auth-data">
$host "localhost";
$user "root"//username del vostro DBMS
$pass "root"//password del vostro DBMS
$nomeDB "dbname"//il nome del vostro DB
// </editor-fold>

mysql_connect$host$user$pass ) or die( "Impossibile effettuare la connessione!" );
mysql_select_db$nomeDB ) or die( "Impossibile selezionare il DB scelto" );


function 
anti_injection_login$sql$isPass )
{
$sql preg_replace"/(from|select|insert|delete|where|drop table|show tables|,|'|#|\*|--|\\\\)/i"""$sql );

$sql trim($sql);
$sql strip_tags($sql);

if( 
$isPass ){
$sql addslashes($sql);
$sql md5(trim($sql));
return 
$sql;
}
else{
$sql addslashes($sql);
return 
$sql;
}

}


$clientHash anti_injection_login$_POST["hash"], false );

$accountName anti_injection_login$_POST["nick"], false ); 
$password anti_injection_login$_POST["pass"], true);

$serverHash "codiceHash"//qui si può generare un hash calcolato su username e password, ma questo lo farete voi ;)

if( !$accountName || !$password 
    echo 
"Devi inserire l'username o la password.";
else {

if( 
$clientHash != $serverHash )
    echo 
"Errore nell'invio del hash.";
else {
        
$querySQL "SELECT * FROM Account WHERE AccountName = '" $accountName "'";
        
$result mysqli_query$querySQL ) or die( "Errore!" );
        
$numRows mysql_num_rows$result );

        if( 
$numRows ) {
            
$data mysqli_fetch_array$result );

            if( !
strcmp$password$data["Password"] ) )
                echo 
"Login effettuato con successo!";
            else 
                echo 
"Password errata.";
         } else
            echo 
"Informazioni errate.";

    }
}

mysql_close();
?>

Salviamo la pagina creata (login.php o come preferite). Essa va caricata sul vostro spazio web in modo da poter accedere al server MySQL presente sulla macchina. Scegliete il percorso che più vi aggrada, ma ricordate di indicarlo correttamente nello script.

Ora, nel vostro progetto Unity, create un nuovo script (l'esempio lo porto in C#, ma potete benissimo adattarlo per il Javascript):

Codice PHP:
using UnityEngine;
using System.Collections;
public class 
GameLogin MonoBehaviour {
private 
string username String.Empty;
private 
string password String.Empty;
public 
string response String.Empty; 

public 
string url "http://mhlab.altervista.org/boxwar/login.php"//cambiate questa string inserendo l'indirizzo del vostro login.php

public string hash "codicehash"//qui si può calcolare un hash basato su username e password, da mandare al server per verificare la correttezza dei dati inviati, ma questo lo farete voi ;)

function OnGUI() {
    
GUI.LabelRect (10108020), "Username:" );
    
GUI.LabelRect (10308020), "Password:" );

    
username GUI.TextFieldRect (901010020), username );
    
password GUI.PasswordField Rect (903010020), password'*' );

    if ( 
GUI.Button Rect (106010020) , "Login" ) )
        
Login();

    
GUI.TextAreaRect (10150500500), response );
}

function 
Login() {

    
WWWForm form = new WWWForm();

    
form.AddField"hash"hash );
    
form.AddField"username"username );
    
form.AddField"password"password );

    
WWW w WWW(urlform);
    yield 
w;
    if (
w.error != null)
        print(
w.error);
    else {
        
response w.data;
        
w.Dispose();
    }

    
username String.Empty;

    
password String.Empty;
}


Basta inserire questo script in un GameObject. Ci sono molte migliorie e features addizionali da aggiungere (che ho omesso, visto che le userò per il mio progetto), ma penso che possa essere d'aiuto e fornire una base di partenza per chi vuole sviluppare qualcosa di suo.




Approfondimento:
E' buona norma eliminare dalla memoria le informazioni sensibili, se non più necessarie. Questo rende più difficile l'intercettazione dei dati per un utente malintenzionato. Logicamente, basta sostituire il contenuto delle aree di memoria interessate, sovrascrivendo il contenuto delle variabili. Posso segnalarvi il metodo di zero-fill contenuto in Kernel32: ZeroMemory. Tale metodo sovrascrive tutti i bit nell'area di memoria del workspace assegnato al processo, sostituendoli con degli "0".




Approfondimento:
E' buona norma non trasmettere i dati in chiaro. Per questo scopo, dovete utilizzare qualche sistema che vi permetta di non mostrare all'utente (direttamente o indirettamente) qualcosa che può essere utilizzato in modo malevolo. Esistono diversi algoritmi che "camuffano" l'informazione, privandola di significato per chi non conosce la chiave di lettura di essa.
Tali metodi sono detti metodi di criptazione e ne esistono molteplici (AES, DES, Tea, Blowfish, ecc).
Potete, inoltre, utilizzare algoritmi di hashing, che fanno perdere significato all'informazione rendendola non interpretabile da altri. Per definizione, però, l'hashing è irreversibile e non è possibile ricavare di nuovo l'informazione originale (salvo alcuni casi, purtroppo).





Ribadisco il concetto che quanto mostrato precedentemente fornisce una BASE di sviluppo di una funzionalità d'accesso valida. Tale metodo, come strutturato in questo caso, non fornisce sicurezza alcuna dei dati, i quali sono trasmessi in chiaro. Ergo, per la sicurezza delle informazioni, è necessaria l'aggiunta di ulteriori features e accorgimenti atti a rendere difficile l'intercettazione di dati sensibili. Non mostrerò, in questa guida, altre metodologie per la salvaguardia dei dati sensibili e per la loro trasmissione (chissà, forse in futuro).




Non mi assumo responsabilità alcuna di eventuali falle nella sicurezza, dovute ad un uso inappropriato del sistema mostrato sopra (in quanto non completo e privo di accorgimenti di sicurezza).


Saluti!
 
Rispondi
#2
Bellaaa ! grazie Smile
 
Rispondi
#3
Aggiunti alcuni approfondimenti riguardanti la sicurezza.

Saluti!
 
Rispondi
#4
Molte grazie ManHunter! Grazie dell'aiuto alla community!
 
Rispondi
#5
Quando inserisco il codice mi esce questo errore:
Codice:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE = inodb' at line 8
 
Rispondi
#6
(01-04-2013, 04:18 PM)GibboSKQ Ha scritto: Quando inserisco il codice mi esce questo errore:
Codice:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE = inodb' at line 8
(01-04-2013, 04:18 PM)GibboSKQ Ha scritto:
Codice:
ENGINE = inodb
Ecco l'errore! E':
Codice:
ENGINE = innodb
 
Rispondi
#7
Se usi altervista puoi comprare l'innodb per 60 centesimi o 600 altercent (se non erro)
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
Video Simple Inventory System alessiobb3b 0 577 04-01-2017, 12:11 AM
Ultimo messaggio: alessiobb3b
Rainbow XML File SaveSystem & Encrypting System alessiobb3b 0 502 23-07-2016, 11:59 PM
Ultimo messaggio: alessiobb3b
Wink Unity Tutorial - Platform Spawn and Checkpoint System alessiobb3b 0 598 17-05-2016, 07:30 PM
Ultimo messaggio: alessiobb3b
Video Tutorial Scripting Unity : Torcia a tempo + Pick Up System alessiobb3b 1 753 21-03-2016, 08:14 PM
Ultimo messaggio: Blackg96
  Lobby,start match, sparo della navetta, nemici e score system TUTORIAL Blackg96 7 1,603 01-08-2015, 09:47 AM
Ultimo messaggio: AltairRevenge

Vai al forum:


Browsing: 1 Ospite(i)