L'ID direttamente nel codice HTML non è intrinsecamente insicuro di per sé.
Tuttavia, mi preoccuperei di questo: sembra che tu stia usando ID consecutivi (dato che l'ID di esempio è un numero basso, direi che è un autoincremento o impostato da un trigger). Ciò costituisce una vulnerabilità di enumerazione degli utenti.
Utilizza id casuali o una lunghezza ragionevole, così facendo ridurrai il rischio che un utente malintenzionato possa indovinare gli ID degli utenti.
Un utente malintenzionato può scrivere uno script che itera su id e aggiunge tutti come amici. Anche se mai respingi qualcuno (e ti assicuro che alcuni non lo faranno, perché ci sono persone che accettano tutti), quello script infastidirebbe molti utenti e aggiungerebbe carico ai tuoi server.
Ciò peggiorerebbe di più le funzioni che l'utente può chiamare con questi ID (ad esempio, questo potrebbe rivelare informazioni private o sensibili sull'utente. Assicurati di controllare chi sta richiedendo e quali o no hanno accesso a tali informazioni ), e ancor peggio se esiste una vulnerabilità di SQL Injection (il fatto che tu abbia menzionato una query nei commenti mi fa preoccupare di questo, per favore usa le dichiarazioni preparate, grazie).
C'è anche il rischio di attacchi cross-site. La tua funzione addFriend
dovrà tradursi in definitiva su alcune richieste al server, giusto? Se esiste la possibilità di simulare quella richiesta (falsificazione richiesta cross-site) o di chiamare la funzione (cross-site scripting), un utente malintenzionato potrebbe inviare un link alla vittima che quando è aperta - mentre la vittima ha una sessione aperta sul tuo sito - comporterebbe l'aggiunta di una terza parte come amico.
Ci sono molte cose da fare per mitigare gli attacchi tra siti. Si prega di fare riferimento agli articoli di Owasp su Cross-Site Requst Forgery e Cross-Site Scripting .
Troverete che una cosa che puoi fare è generare codici che significano "Aggiungi X come amico" che sono monouso e legati alla sessione dell'utente. Ciò significherebbe che nessuno script o richiesta di falsificazione sarà in grado di aggiungere un amico per il quale il codice non è stato generato. E lo stesso approccio può essere fatto per qualsiasi altra funzione o richiesta che deve essere protetta.
Altre cose che potresti prendere in considerazione: puoi anche "aggiungere un cooldown" all'operazione, assicurandoti che una funzione che li chiama in rapida successione non funzioni. In effetti, l'esecuzione di uno potrebbe invalidare e rigenerare tutti gli altri codici, rendendo qualsiasi script che li legge e li usa come difficilmente implementabili (in più si saprebbe chi continua a farlo e produce un divieto temporaneo).
Addendum: utilizza Captcha in attività notevoli.
Nota: non memorizzarli nel database permanente. Per esperienza personale, questo diventa un disastro molto rapidamente. Inoltre, non legarli all'utente, ma alla sessione. In effetti, usare le variabili di sessione (anche se supportato da un database) è un buon approccio.
Tuttavia, invece di memorizzare tutti i codici validi (e salvare la memoria sul server), è possibile generare e memorizzare una chiave criptografica e utilizzarla per codici cifrati che rappresentano l'operazione. Se lo fai, invalidare i codici implica la sostituzione della chiave con una nuova.
Vedi anche: Il bug di Moonpig: come sono stati esposti 3.000.000 di dettagli dei clienti dove Tom Scott spiega una numerazione di utenti vulnerabilità.