Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-02-2009, 12:28   #1
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
[PHP+MySQL] Consiglio autenticazione utente

Ciao a tutti,
Sono alle prese con un login form in php. Gestisco utenti e password all'interno di un db e vorrei un vostro parere.

Per l'autenticazione ho ragionato così:

1. l'utente inserisce uid e pwd, e clicca su ok
2. lo script entra nel db dove sono le pwd ed i nomi utente ed estrapola la pwd reale corrispondente all'uid inserito.
3. lo script genera una tabella temporanea (se non esiste) e ne cancella il contenuto
4. lo script inserisce sulla prima riga le due password, quella inserita dall'utente e quella vera
5. confronta le due password.

Ora ho visto che il sistema è un tantino arzigogolato, più che altro mi preoccupa il fatto che se dovessero loggare svariati utenti sarebbe difficile cancellare il contenuto della tabella temporanea.

A questo proposito pensavo di creare un ID sessione univoco, o tramite qualche altro metodo, per cancellare solo ed esclusivamente quella riga (non mi fido di cancellare la riga corrispondente ad un singolo inserimento di password per ovvie ragioni di possibili "doppioni").

Più o meno comunque dovrà lavorare così.

Che ne pensate? Consigli, critiche, dritte..?

grazie!
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 12:42   #2
ale09hh
Senior Member
 
L'Avatar di ale09hh
 
Iscritto dal: Jan 2008
Messaggi: 430
Ciao io nel mio sito ho fatto così:

-l'utente inserisce uid e pwd
-script sql:
Codice:
$result=mysql_query("SELECT * FROM utenti WHERE username = '$user' AND password = '$pass'",$dbconnect);
-
Codice:
$rowCheck = mysql_num_rows($result);
-se le righe di ritorno sono 0 --->password sbagliata
-se è 1 --> password esatta --> creazione cookie

PS: io non sono un esperto quindi questo sistema sarà non sicuro o ce ne saranno di migliori.. ma funziona
__________________
[ Raidmax Ninja | Intel [email protected] Ghz | Arctic Cooling Freezer 7 Pro | Asus P5K-E WiFi-AP | 6GB Corsair 800Mhz | XFX HD5770XT | 2xWestern Digital 320GB Raid0 | Pioneer DVR-215D | LG L222WS ]
ale09hh è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 12:51   #3
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
spero di non dire castronerie, ma il tuo script mi sembra vulnerabile ad un injection.

se tu nel campo password inserisci
Quote:
'OR USER='nomeutente'
dovresti poter accedere lo stesso anche se sbagli password, perchè OR consente di restituire true anche se solo una delle due condizioni è soddisfatta.

In sostanza: preleva dalla tabella la riga che corrisponde al nome utente ed alla password (oppure al nome utente).


prova un po' vediamo che succede
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 12:55   #4
ale09hh
Senior Member
 
L'Avatar di ale09hh
 
Iscritto dal: Jan 2008
Messaggi: 430
No ora ho provato a mettere la password sbagliata e non riesco ad accedere...

Per quanto riguarda la sicurezza non lo so, te l'ho detto non sono un esperto, sono già contento che funziona
__________________
[ Raidmax Ninja | Intel [email protected] Ghz | Arctic Cooling Freezer 7 Pro | Asus P5K-E WiFi-AP | 6GB Corsair 800Mhz | XFX HD5770XT | 2xWestern Digital 320GB Raid0 | Pioneer DVR-215D | LG L222WS ]
ale09hh è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 19:27   #5
Big Bamboo
Member
 
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
Quote:
Originariamente inviato da packllama Guarda i messaggi
3. lo script genera una tabella temporanea (se non esiste) e ne cancella il contenuto
4. lo script inserisce sulla prima riga le due password, quella inserita dall'utente e quella vera
5. confronta le due password.
Non capisco perché tu faccia queste operazioni (che ritengo inutili)

Ti elenco una possibile soluzione

1 form con user e password
2 pagina che legge questi dati ed estrapola da database la password cercando tra gli username (che dovranno per forza di cose essere univoci)
3 confronta le 2 password ed autorizza se uguali

Di solito nel database si inserisce un hash della password e non la stessa in chiaro. Puoi usare md5 come algoritmo.
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning
Big Bamboo è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 19:32   #6
SerMagnus
Senior Member
 
L'Avatar di SerMagnus
 
Iscritto dal: Sep 2005
Messaggi: 1400
concordo con quanto detto dagli altri, ti complichi la vita per nulla, una sola query per verificare l'utente e poi usa le sessioni invece del cookie per salvare lo stato dell'autorizzazione
SerMagnus è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 20:05   #7
vizzz
Senior Member
 
L'Avatar di vizzz
 
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
al posto di md5 meglio usare SHA1, se poi hai accesso fisico alla macchina (puoi installare pacchetti) esistono dei moduli PEAR che gestiscono l'autenticazione su database.
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
vizzz è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 23:26   #8
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da packllama Guarda i messaggi
spero di non dire castronerie, ma il tuo script mi sembra vulnerabile ad un injection.
Quote:
Originariamente inviato da Big Bamboo Guarda i messaggi
Non capisco perché tu faccia queste operazioni (che ritengo inutili)

Ti elenco una possibile soluzione

1 form con user e password
2 pagina che legge questi dati ed estrapola da database la password cercando tra gli username (che dovranno per forza di cose essere univoci)
3 confronta le 2 password ed autorizza se uguali

Di solito nel database si inserisce un hash della password e non la stessa in chiaro. Puoi usare md5 come algoritmo.
Quoto a gran voce
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2009, 08:44   #9
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
Le faccio perchè non ci capisco niente, ecco perchè chiedo consiglio


Avevo dei dubbi sulla sicurezza di uno script del tipo

Codice:
"SELECT password FROM utenti WHERE user='$user_form' AND password='$pwd_form'"
perchè temo, come già citato, che sia vulnerabile.

Però se mi dite che è una complicazione inutile la mia soluzione (ci vogliono 4 secondi per ottenere risposta, lol, su un db di 3 password) allora proverò a criptare le password.

E comunque, come evitare che qualcuno inserisca ad esempio una condizione OR 1 - - all'interno del campo pwd?
Il mio grande cruccio é rendere sicuro il sistema di autenticazione..

Con la query che mi hai consigliato, se io metto nel campo password una condizione del tipo
Codice:
'OR 1 - - '
..dovrebbe sempre garantire l'accesso...?

Consigli bene accetti! e grazie ancora
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2009, 16:45   #10
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
Allora, questo è il codice risultante da vostri consigli. Mi fareste avere la vostra opinione in merito? grazie!

Codice PHP:
function password()

{
 
$link mysqli_connect('server''user''password''nomedb');  
 if (!
$link) {print "Errore durante la connessione al server"; print mysqli_error($link);exit();}
  
    
#Dichiaro le variabili locali
    
$uid_form=$_POST['uid'];
    
$pwd_form=$_POST['pwd'];
    
    
#aggiungo un backslash prima di ogni single quote per prevenire 
    #SQL injection, ma prima controllo se sono abilitati i magic quotes
    
if (!get_magic_quotes_gpc()){
    
$pwd_form=addslashes($pwd_form);}
    
    
#Faccio l'hash md5 della password inserita per renderla
    #confrontabile con quella del database utenti
    
$pwd_hash=md5($pwd_form);

    
#Procedo con la select: seleziono la password coerentemente con i dati forniti
    
    
if ($query1=mysqli_query($link,"SELECT password FROM utenti WHERE utente='$uid' AND password='$pwd_hash'"))
        {
        
$row=mysqli_fetch_row($query1);
            
$result=$row[0];
            
            
#Se il record risulta nullo, errore
            
if ($result==NULL) {print "Record inesistente";exit();}
        }
    
    if (
$result==$pwd_hash){print "Password corretta. Benvenuto, ".$uid_form."\n";}
    else {print 
"Password errata.\n";}
    

packllama è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2009, 19:24   #11
Big Bamboo
Member
 
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
Quote:
Originariamente inviato da packllama Guarda i messaggi
Allora, questo è il codice risultante da vostri consigli. Mi fareste avere la vostra opinione in merito? grazie!

Codice PHP:
function password()

{
 
$link mysqli_connect('server''user''password''nomedb');  
 if (!
$link) {print "Errore durante la connessione al server"; print mysqli_error($link);exit();}
  
    
#Dichiaro le variabili locali
    
$uid_form=$_POST['uid'];
    
$pwd_form=$_POST['pwd'];
    
    
#aggiungo un backslash prima di ogni single quote per prevenire 
    #SQL injection, ma prima controllo se sono abilitati i magic quotes
    
if (!get_magic_quotes_gpc()){
    
$pwd_form=addslashes($pwd_form);}
    
    
#Faccio l'hash md5 della password inserita per renderla
    #confrontabile con quella del database utenti
    
$pwd_hash=md5($pwd_form);

    
#Procedo con la select: seleziono la password coerentemente con i dati forniti
    
    
if ($query1=mysqli_query($link,"SELECT password FROM utenti WHERE utente='$uid' AND password='$pwd_hash'"))
        {
        
$row=mysqli_fetch_row($query1);
            
$result=$row[0];
            
            
#Se il record risulta nullo, errore
            
if ($result==NULL) {print "Record inesistente";exit();}
        }
    
    if (
$result==$pwd_hash){print "Password corretta. Benvenuto, ".$uid_form."\n";}
    else {print 
"Password errata.\n";}
    

io farei così (premetto che php lo conosco veramente poco)
Codice PHP:
$query1=mysqli_query($link,"SELECT password FROM utenti WHERE utente='$uid'");
$row=mysqli_fetch_row($query1);
$result=$row[0];  
#Se il record risulta nullo, errore
if ($result==NULL) {print "Record inesistente";exit();}   
if (
$result==$pwd_hash){print "Password corretta. Benvenuto, ".$uid_form."\n";}
else {print 
"Password errata.\n";} 
In pratica basta selezionare la riga con l'uid (e non anche con la password) e verificare se il valore restituito della password è uguale.

Contro SQL injection in altri linguaggi c'è la possibilità di parametrizzare la query. Credo che esista qualcosa di simile anche per php.
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning
Big Bamboo è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2009, 08:30   #12
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
In effetti hai ragione, controllo due volte la password e non serve a niente.


Con la procedura da me usata, lo script non fa altro che prendere ogni stringa ed inserire un backslash per ogni apostrofo. Ciò interferisce con il database solo nel momento in cui l'utente malizioso invia al posto della password una clausola SQL e deve usare per forza gli apici (rendendo così vano il suo sforzo).

Sono molto curioso di saperne di più sulla parametrizzazione, puoi spiegarmene il principio?

Grazie.
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2009, 20:26   #13
Big Bamboo
Member
 
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
I dati inseriti dall'utente vengono gestiti a livello database.
Spiegazione molto semplificata:
il web server invia al database la query da eseguire e dei segnaposto.
sarà poi compito del database riempire i segnaposto con i dati dell'utente, eseguendo solo una query con i dati corretti. se l'input fornito è sbagliato (tentata sql injection) la query fallisce
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning
Big Bamboo è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2009, 21:44   #14
woomacoder
Member
 
L'Avatar di woomacoder
 
Iscritto dal: Mar 2009
Città: Varese
Messaggi: 175
Quote:
Originariamente inviato da packllama Guarda i messaggi
spero di non dire castronerie, ma il tuo script mi sembra vulnerabile ad un injection.

se tu nel campo password inserisci
dovresti poter accedere lo stesso anche se sbagli password, perchè OR consente di restituire true anche se solo una delle due condizioni è soddisfatta.

In sostanza: preleva dalla tabella la riga che corrisponde al nome utente ed alla password (oppure al nome utente).


prova un po' vediamo che succede
Solo a quella? direi ad un bel po di vulnerabilità.
Consiglio un LIMIT 1 sulla query di SELECT utente AND password, si migliorano le prestazioni di sql (una volta trovato sql si ferma, non va a cercare oltre)
woomacoder è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 00:28   #15
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Per parametrizzare la query esistono i PREPARED STATEMENTs.

Sono delle query con "segnaposto" che vengono mandate al DBMS e lui le pre-compila. Poi si associano le variabili contententi i parametri (bind) e le variabili che conterranno le colonne del resultset restituito.

Allora vediamo se riesco a rispolverare del codice (copy&paste):

Codice:
<?php
$mysqli = new mysqli( ... );

/* creo un oggetto mysqli_stmt */
$stmt =  $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM `users` WHERE `uid`=? AND `pwd_hash`=? LIMIT 1")) {  //i punti di domanda sono segnaposto per i parametri

    /* vaccio il bind delle variabili che contengono i parametri */
    $stmt->bind_param("ss", $_POST['uid'], md5hash($_POST['pwd']));

    /* eseguo la query includendo i parametri */
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows = 1) {
        echo "benvenuto!";
    } else {
         echo "credenziali errate!";
    }

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>
La classe chiave è mysqli_stmt.
La fase di bind dei risultati non ti serve perché devi solo controllare che il numero di righe restituite dalla query sia uguale a uno.
Ti conviene dare un'occhiata alla funzione bind_param: se i campi nel database sono stringhe, devi usare "s" nel primo parametro della funzione, "i" per gli interi, "d" per i double, "b" per blob. Un carattere per ogni variabile da bindare.
Ricapitolando le fasi principali sono:
- connettersi al database (new mysqli)
- inizializzare un oggetto mysqli_stmt (stmt_init)
- compilare la query con i segnaposto ? (prepare)
- fare il bind di eventuali parametri (bind_param)
- eseguire la query
- fare (eventualmente) il bind delle variabili alle colonne del resultset (bind_result)
- caricare i risultati (fetch riga per riga)
- eventualmente riutilizzare il prepared statement con altri parametri (è questo uno dei principali vantaggi, inoltre è leggermente più veloce di semplici query)
- chiudere il prepared statement (close)
- chiudere la connessione al dbms (close)

Spero di essere stato abbastanza chiaro. Comunque leggiti quelle 2 pagine di documentazione e in caso di dubbi chiedi pure.
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 02:09   #16
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Per parametrizzare la query esistono i PREPARED STATEMENTs.

Sono delle query con "segnaposto" che vengono mandate al DBMS e lui le pre-compila. Poi si associano le variabili contententi i parametri (bind) e le variabili che conterranno le colonne del resultset restituito.

Allora vediamo se riesco a rispolverare del codice (copy&paste):

Codice:
<?php
$mysqli = new mysqli( ... );

/* creo un oggetto mysqli_stmt */
$stmt =  $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM `users` WHERE `uid`=? AND `pwd_hash`=? LIMIT 1")) {  //i punti di domanda sono segnaposto per i parametri

    /* vaccio il bind delle variabili che contengono i parametri */
    $stmt->bind_param("ss", $_POST['uid'], md5hash($_POST['pwd']));

    /* eseguo la query includendo i parametri */
    $stmt->execute();
    $stmt->store_result();

    if ($stmt->num_rows = 1) {
        echo "benvenuto!";
    } else {
         echo "credenziali errate!";
    }

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>
La classe chiave è mysqli_stmt.
La fase di bind dei risultati non ti serve perché devi solo controllare che il numero di righe restituite dalla query sia uguale a uno.
Ti conviene dare un'occhiata alla funzione bind_param: se i campi nel database sono stringhe, devi usare "s" nel primo parametro della funzione, "i" per gli interi, "d" per i double, "b" per blob. Un carattere per ogni variabile da bindare.
Ricapitolando le fasi principali sono:
- connettersi al database (new mysqli)
- inizializzare un oggetto mysqli_stmt (stmt_init)
- compilare la query con i segnaposto ? (prepare)
- fare il bind di eventuali parametri (bind_param)
- eseguire la query
- fare (eventualmente) il bind delle variabili alle colonne del resultset (bind_result)
- caricare i risultati (fetch riga per riga)
- eventualmente riutilizzare il prepared statement con altri parametri (è questo uno dei principali vantaggi, inoltre è leggermente più veloce di semplici query)
- chiudere il prepared statement (close)
- chiudere la connessione al dbms (close)

Spero di essere stato abbastanza chiaro. Comunque leggiti quelle 2 pagine di documentazione e in caso di dubbi chiedi pure.
La mia domanda non è molto pertinente con il thread, però vorrei sapere una buona guida dove poter studiare SQL e perchè no, anche PHP.
Ovviamente che spieghino da zero.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 08:45   #17
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Per parametrizzare la query esistono i PREPARED STATEMENTs.

Sono delle query con "segnaposto" che vengono mandate al DBMS e lui le pre-compila. Poi si associano le variabili contententi i parametri (bind) e le variabili che conterranno le colonne del resultset restituito.

Ok, ero scettico sui segnaposto perchè dalle mie poche informazioni erano legati esclusivamente a PEAR al quale non voglio assolutamente essere legato (per questioni di portabilità di tutto il sistema). Tant'è vero che avrete notato che PEAR poteva essere usato anche per l'interazione materiale con MySQL, ma non l'ho fatto.

Diciamo che a volte i magic quotes traggono in inganno perchè non si sa se ci siano o meno, quindi bisogna trovare un sistema indipendente da loro (anche perchè se devi mandare in print una stringa quotata vengono fuori quegli antipatici backslash!) e il mio era semplicemente un surrogato dei magic quotes.


Bene, studio i vostri codici e poi preparo un altro ciocchetto da mettere al fuoco qui sul forum... grazie!



Per ~FullSyst3m~ : ci dovrebbe essere una discussione molto molto recente a proposito di ciò che chiedi.

Per woomacoder: ottimo il suggerimento, lo provo anche sul mio script (oddio, non devo gestire trilioni di record, però fa sempre comodo!) grazie!

Ultima modifica di packllama : 02-03-2009 alle 09:19.
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 09:54   #18
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da packllama Guarda i messaggi
Ok, ero scettico sui segnaposto perchè dalle mie poche informazioni erano legati esclusivamente a PEAR al quale non voglio assolutamente essere legato (per questioni di portabilità di tutto il sistema). Tant'è vero che avrete notato che PEAR poteva essere usato anche per l'interazione materiale con MySQL, ma non l'ho fatto.

Diciamo che a volte i magic quotes traggono in inganno perchè non si sa se ci siano o meno, quindi bisogna trovare un sistema indipendente da loro (anche perchè se devi mandare in print una stringa quotata vengono fuori quegli antipatici backslash!) e il mio era semplicemente un surrogato dei magic quotes.


Bene, studio i vostri codici e poi preparo un altro ciocchetto da mettere al fuoco qui sul forum... grazie!



Per ~FullSyst3m~ : ci dovrebbe essere una discussione molto molto recente a proposito di ciò che chiedi.

Per woomacoder: ottimo il suggerimento, lo provo anche sul mio script (oddio, non devo gestire trilioni di record, però fa sempre comodo!) grazie!
Quale è la discussione?
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 10:13   #19
packllama
Member
 
Iscritto dal: Dec 2005
Messaggi: 42
[OT] risposta a ~FullSyst3m~

Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Quale è la discussione?
http://www.hwupgrade.it/forum/showthread.php?t=1934486
packllama è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2009, 10:24   #20
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da packllama Guarda i messaggi
Cercavo anche quelli per SQL. Ne conosci?
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Monitor da ufficio e gaming a prezzi ass...
Silent Hill 2 Remake è un trionfo...
Logitech svende le periferiche: mouse ga...
Uno studio accusa i principali chatbot A...
Loot box e gioco d'azzardo: Valve ai fer...
Pulire casa al posto tuo? Il robot umano...
iPhone 17 da 256GB al minimo storico: or...
Quasi 6.000 giochi su Steam hanno supera...
Scope lavapavimenti super scontate: Drea...
WhatsApp prepara account dedicati ai min...
Nemotron 3 Super: modello AI open da 120...
Addio caricamenti lenti? Microsoft aggio...
Valve definisce i requisiti di certifica...
Microsoft accelera l'integrazione tra Xb...
Smartphone potenti sotto i 300€: ecco i ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v