• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Vb.net - Secure Login System

Garu

Utente Attivo
Autore del topic
9 Ottobre 2011
412
0
Miglior risposta
0
Visto le numerose richieste di una guida per realizzare un sistema di login sicuro ( http://www.sciax2.it/forum/visual-basic/vbulletin-net-secure-login-system-520690.html ) ho deciso di scrivere una guida, abbastanza completa su come realizzarlo.

NB: I codici in rosso sono quelli da modificare!


Registrazione


Iniziamo creandoci uno spazio web su
Perfavore, Entra oppure Registrati per vedere i Link!
,o con un qualsiasi servizio che offra hosting ftp e uno (o più) database sql.

Creiamo il file register.php e inseriamo:

<?php
// Connection details
$dbhost = "localhost";
$dbname = "dbname"; // Inserire nome database preceduto da my_
$dbuser = "user"; // username
$dbpass = "pass"; // password

$user = addslashes($_POST["username"]);
$pass = addslashes($_POST["password"]);
$hwid = addslashes($_POST["hwid"]);

mysql_connect($dbhost, $dbuser, $dbpass)or die("3");
$verb = mysql_select_db($dbname);

if ($verb)
{
if (!empty($user) and !empty($pass) and !empty($hwid))
{
if ( mysql_num_rows( mysql_query( "SELECT * FROM login WHERE username='".$user."'" ) ) == 0 ) {
$sqlquery = "INSERT INTO login (username, password) VALUES('$user','$pass')";
$results = mysql_query($sqlquery);
$hwidfile = fopen("hwid.txt","a");
fwrite($hwidfile, $hwid."\r\n");
fclose($hwidfile);
echo("1");
}else{
echo("2");
}
}else{
echo("0");
}
}
mysql_close();
?>

Funzionamento(tenete conto che di php capisco ben poco :P ):

Inizialmente vanno inseriti manualmente i dati del nostro spazio web.

Lasciamo localhost com'è ,sostituiamo dbname con il nome del nostro database preceduto da my_ , se ad esempio abbiamo il sito ciao.altervista.org, dovremo sostituirlo con my_ciao.
Sostituiamo username e password con le nostre credenziali, per intenderci quelle che mettete su filezilla o al momento del login su altervista.

A questo punto il file prende le informazioni inviate dal client (Vedremo dopo) che saranno Username, Password e hwid.

Dopo aver verificato che contengano effettivamente qualcosa (che non siano vuote) cerca nel database tramite una query username e password, e, in caso non esistano le inserisce e scrive l'hardware id nel file.

i codici echo("1"); echo("2");... servono come risposta al nostro programma che gli interpreterà.

A questo punto logghiamo su altervista, andiamo su tools->PhpMyadmin (facciamo il login con le stesse credenziali) e premiamo sul 3 bottone in alto a sinistra (quello con scritto sql:
b_selboard.png
) e inseriamo la seguente query che creerà la table "login" nel nostro database:

-- phpMyAdmin SQL Dump
--
Perfavore, Entra oppure Registrati per vedere i Link!

-- --

CREATE TABLE `login` (
`username` text collate latin1_german1_ci NOT NULL,
`password` text collate latin1_german1_ci NOT NULL,
FULLTEXT KEY `password` (`password`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;


Creiamo il programma



HWID


Per prima cosa creeremo il modulo contente le funzioni per "calcolare" l'hardware id, quindi creiamo un nuovo modulo e inseriamo

Importiamo System.Management dai riferimenti

Imports System.IO
Imports System.Security.Cryptography
Imports System.Management
Imports System.Text
Module HardwareID
Public myhwid As String

Public Function HwId() As String
Return MD5_Encode(ID)
End Function

Public Function MD5_Encode(ByVal strString As String) As String
Dim MD5 As New MD5CryptoServiceProvider
Dim Data As Byte()
Dim Result As Byte()
Dim Res As String = ""
Dim Tmp As String = ""

Data = Encoding.ASCII.GetBytes(strString)
Result = MD5.ComputeHash(Data)
For i As Integer = 0 To Result.Length - 1
Tmp = Hex(Result(i))
If Len(Tmp) = 1 Then Tmp = "0" & Tmp
Res += Tmp
Next
Return Res.ToLower
End Function

Private Function ID()
Dim out As String = ""
Try
Dim searcher As New ManagementObjectSearcher( _
"root\CIMV2", _
"SELECT * FROM Win32_Processor")
For Each queryObj As ManagementObject In searcher.Get()
out &= queryObj("ProcessorId").ToString
Next
Catch : End Try
Try
Dim searcher As New ManagementObjectSearcher( _
"root\CIMV2", _
"SELECT * FROM Win32_VideoController")
For Each queryObj As ManagementObject In searcher.Get()
out &= "-" & queryObj("AdapterRAM").ToString
Next
Catch : End Try
Try
Dim searcher As New ManagementObjectSearcher( _
"root\CIMV2", _
"SELECT * FROM Win32_DiskDrive")
For Each queryObj As ManagementObject In searcher.Get()
out &= "-" & queryObj("Size").ToString
Next
Catch : End Try
Return out
End Function
End Module



Form di registrazione




Creiamo una form con due textbox (la prima contente l'username la seconda contente la password)

Prima di tutto importiamo!:

Imports System.IO
Imports System.Security.Cryptography
Imports System.Management
Imports System.Text
Imports System.Net

Nell'evento load del form calcoliamo l'hardwareId

Private Sub FormRegistrazione_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myhwid = HwId()
End Sub


Successivamente creiamo la funzione per la registrazione

Sub Register()
If TextBox2.Text <> Nothing AndAlso TextBox1.Text <> Nothing Then '
Try
Dim request As HttpWebRequest = CType(WebRequest.Create("http://VOSTROSITO.altervista.org/Login/register.php"), HttpWebRequest)
request.Method = "POST"
request.ContentType = "application/x-www-form-urlencoded"
Dim Post As String = ("username=" & TextBox1.Text & "&password=" & MD5_Encode(TextBox2.Text) & "&hwid=" & myhwid)
Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
request.ContentLength = byteArray.Length
Dim DataStream As Stream = request.GetRequestStream()
DataStream.Write(byteArray, 0, byteArray.Length)
DataStream.Close()
Dim Response As HttpWebResponse = request.GetResponse()
DataStream = Response.GetResponseStream()
Dim reader As New StreamReader(DataStream)
Dim ServerResponse As String = reader.ReadToEnd()
reader.Close()
DataStream.Close()

Response.Close()


If ServerResponse = 1 Then
MsgBox("Registrazione avvenuta con successo", MsgBoxStyle.Information)
ElseIf ServerResponse = 0 Then
MsgBox("Nessun dato registrato", MsgBoxStyle.Exclamation)

ElseIf ServerResponse = 2 Then
MsgBox("Nome utente già utilizzato", MsgBoxStyle.Exclamation)
ElseIf ServerResponse = 3 Then
MsgBox("Impossibile connettersi al database", MsgBoxStyle.Critical)

End If

Catch
MsgBox("Impossibile connettersi al server", MsgBoxStyle.Critical)
End Try
Else
MsgBox("Inserire username e/o password per continuare", MsgBoxStyle.Exclamation)
End If
End Sub

Il programma esegue una richiesta 'post' al nostro modulo php come richiesto da quest'ultimo inserendo come argomenti l'username la password e l'hardwareID, e attende la risposta, la legge e la interpreta.

Ora basterà inserire Register() in un bottone ;)



Login


Come per la registrazione dovremo creare un file php, che chiameremo login.php (Che fantasia!) inserendoci il seguente codice:

<?php
/
$dbhost = "localhost";
$dbname = "dbname";
$dbuser = "user";
$dbpass = "pass";


$user = addslashes($_GET['username']);
$pass = addslashes($_GET['password']);

mysql_connect($dbhost, $dbuser, $dbpass)or die("3");
$verb = mysql_select_db($dbname);

if ($verb)
{
$sql = "SELECT * FROM login WHERE username='".$user."'";
$quer = mysql_query($sql) or die("4");
$num = mysql_num_rows($quer);
if ($num == 0)
{
echo("0");
exit();
}
else
{
$row = mysql_fetch_object($quer);
$passwort = $row->password;
if ($passwort == $pass)
{
echo("1");
exit();
}
else
{
echo("2");
exit();
}
}
}
mysql_close();
?>


Successivamente creiamo la form per i login uguale a quella per la registrazione, con due textbox la prima per l'username la seconda per la password.


Nell'evento load del form calcoliamo l'hardwareId

Private Sub FormRegistrazione_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myhwid = HwId()
End Sub


Successivamente creiamo la funzione per il login:

Private Sub Login() '
Try
Dim WC As New Net.WebClient
Dim response As String = WC.DownloadString("http://VOSTROSITO.altervista.org/Login/login.php?username=" & TextBox1.Text & "&password=" & MD5_Encode(TextBox2.Text))

Select Case response
Case 0
MsgBox("L'utente non esiste", MsgBoxStyle.Exclamation)
Case 1
Dim hwid As String = WC.DownloadString("http://vostrosito.altervista.org/Login/hwid.txt")
If hwid.Contains(myhwid) = True Then
MsgBox("Login effettuato con successo", MsgBoxStyle.Information)
' LOGIN EFFETTUATO
Else
MsgBox("Hwid Errato", MsgBoxStyle.Exclamation)
End If
Case 2
MsgBox("Password Errata", MsgBoxStyle.Exclamation)
Case 3
MsgBox("Impossibile connettersi al database", MsgBoxStyle.Critical)
Case 4
MsgBox("Impossibile trovare tavola mysql", MsgBoxStyle.Critical)
End Select

Catch
MsgBox("Impossibile connettersi al server", MsgBoxStyle.Critical)
End Try

End Sub

Che possiamo utilizzare anche sottoforma di funzione se vogliamo un codice più pulito e versatile:

Private Function Login() As Boolean
Try
Dim WC As New Net.WebClient
Dim response As String = WC.DownloadString("http://projecthosting.altervista.org/Login/login.php?username=" & TextBox1.Text & "&password=" & MD5_Encode(TextBox2.Text))

Select Case response
Case 0
MsgBox("L'utente non esiste", MsgBoxStyle.Exclamation)
Return False
Case 1
Dim hwid As String = WC.DownloadString("http://projecthosting.altervista.org/Login/hwid.txt")
If hwid.Contains(myhwid) = True Then
MsgBox("Login effettuato con successo", MsgBoxStyle.Information)
Return True
Else
MsgBox("Hwid Errato", MsgBoxStyle.Exclamation)
Return False
End If
Case 2
MsgBox("Password Errata", MsgBoxStyle.Exclamation)
Return False
Case 3
MsgBox("Impossibile connettersi al database", MsgBoxStyle.Critical)
Return False
Case 4
MsgBox("Impossibile trovare tavola mysql", MsgBoxStyle.Critical)
Return False
End Select

Catch
MsgBox("Impossibile connettersi al server", MsgBoxStyle.Critical)
Return False
End Try

End Function


Ora basterà inserire Login () All'interno di un bottone (O dove più vi aggrada).


Per concludere vi basterà caricare un file di testo con nome hwid.txt nella stessa cartella dei moduli .php e avrete concluso, questo file conterrà tutti gli hwid dei vostri utenti.


In conclusione ecco uno zip con tutti i file da caricare e incluso anche il progetto già fatto, ovviamente dovrete modificare tutti con i vostri dati ;)
Perfavore, Entra oppure Registrati per vedere i Link!



Garu
 
Ultima modifica:
Riferimento: Vb.net - Secure Login System

Hai spiegato molto bene, non capisco perchè hai usato tutto quel codice per ricavare l'id dell'hardware
peccato che ho il tutto nell'altro HDD sennò lo postavo quì. Come sistema è abbastanza sicuro. Il problema è :
Ma se si rompe il PC dovremo crearci un altro account? :emoji_relieved:
 
Riferimento: Vb.net - Secure Login System

Hai spiegato molto bene, non capisco perchè hai usato tutto quel codice per ricavare l'id dell'hardware
peccato che ho il tutto nell'altro HDD sennò lo postavo quì. Come sistema è abbastanza sicuro. Il problema è :
Ma se si rompe il PC dovremo crearci un altro account? :emoji_relieved:

Tutto quel codice è il mio metodo, ognuno può avere il proprio, il mio codice è lungo perchè per ricavare le informazioni utilizza le wmi di windows che non più laboriose da utilizzare.

L'essere legato all'hardware è una certezza in fatto di sicurezza poichè anche se ti rubano la password non possono entrare, comunque si può togliere facilmente il controllo, o magari modificarlo per permettere un 'rinnovo' dell'id non è complicato
 
Riferimento: Vb.net - Secure Login System

Mi basta cambiare computer (potrei utilizzare anche uno smartphone) e riavviare il modem per perdere l'account.
 
Riferimento: Vb.net - Secure Login System

Mi basta cambiare computer (potrei utilizzare anche uno smartphone) e riavviare il modem per perdere l'account.

Come ho già spiegato sopra:
L'essere legato all'hardware è una certezza in fatto di sicurezza poichè anche se ti rubano la password non possono entrare, comunque si può togliere facilmente il controllo, o magari modificarlo per permettere un 'rinnovo' dell'id non è complicato.

Ho postato appositamente tutti i sorgenti in modo che tutti potessero modificarlo secondo le proprie esigenze
 
Riferimento: Vb.net - Secure Login System

Se si parla di "software per computer" ( come in questo caso ) e non di cellulari ( come ha accennato DarkenRahl ) è inutile cercare delle "falle" per dimostrare l'insicurezza di questo metodo. Questo metodo è sicuro, punto.
 
Riferimento: Vb.net - Secure Login System

Se si parla di "software per computer" ( come in questo caso ) e non di cellulari ( come ha accennato DarkenRahl ) è inutile cercare delle "falle" per dimostrare l'insicurezza di questo metodo. Questo metodo è sicuro, punto.

Me l'hai gufata :wtf: credo di aver trovato una vulnerabilità, però da lato server, di tipo sql injection
 
Riferimento: Vb.net - Secure Login System

A me non effettua la connessione tra il register e database..cosa posso fare ._.
 
Riferimento: Vb.net - Secure Login System

A me non effettua la connessione tra il register e database..cosa posso fare ._.

la tua domanda è un po' generica...
Hai sostituito questa parte con i tuoi dati:?
$dbhost = "localhost";
$dbname = "dbname"; // Inserire nome database preceduto da my_
$dbuser = "user"; // username
$dbpass = "pass"; // password
 
Io ho seguito tutta la guida, 0 errori però non mi funziona il login, praticamente quando cerco di loggare non viene nessun MsgBox, come mai ?