Attualmente sto creando un programma simile a Skype, che usa un sistema ibrido peer to peer per comunicare tra gli utenti (ad es. il server contiene tutti gli IP degli utenti, un client che vuole connettersi a un amico dirà al server, che invierà a ciascun client l'IP dell'altro in modo che possano iniziare la perforatura per stabilire una connessione tra di loro).
So che con Skype ci sono molti siti web che ti permettono di inserire un nome utente e ottenere facilmente il suo indirizzo IP. La mia domanda è, qual è il modo migliore per prevenire un simile exploit?
Ecco alcune soluzioni che potrei pensare:
- salva tutti gli elenchi di amici di tutti gli utenti sul server (in modo che il server possa eliminare le richieste IP dagli utenti che non si trovano nell'elenco degli amici del cliente richiesto)
- ogni volta che al server viene richiesto l'IP di un client, chiedere al client se il richiedente è presente nell'elenco dei propri amici (in caso contrario, non rispondere)
- chiedi a ciascun client di utilizzare una chiave segreta per comunicare con il server (in modo che solo i client registrati possano inviare richieste IP)
Sentiti libero di aggiungere una soluzione diversa, ancora una volta, queste sono solo soluzioni a cui potrei pensare in cima alla testa mentre scrivevo questa domanda.
Inoltre, una domanda correlata che volevo chiedere - quale sarebbe la migliore pratica in un programma del genere:
Chiedi ad ogni cliente di memorizzare gli IP dei suoi amici e di fare in modo che il server lo avvisi ogni volta che viene cambiato
-VS-
Chiedi al cliente di chiedere al server l'IP di un amico ogni volta che vuole iniziare una connessione diretta con lui (tieni presente che il client deve comunque dire al server ogni volta che sta tentando di connettersi a qualcuno, in modo che il buco sia perforato lavorare).
P.S. Non ho mai creato un programma del genere e non sto seguendo alcun tutorial o altro. Se c'è un modo migliore di fare qualcosa che ho scritto, o se ho sbagliato qualcosa, sarei molto felice se potessi dirlo.