1) ok

2a) Nel senso che vuoi farlo ma non sai come fare?

2b) Quello che stai facendo è ESATTAMENTE quello che NON dovresti fare!

Primo: aver usato una stored procedure non cambia il fatto che stai cercando l'utente nella tabella degli utenti usando sia la username che la password, e questo NON va fatto, per tante ragioni...
Secondo: la funzione str_crypt NON fa parte di PHP, quindi è una tua funzione, e per dirti se possa essere sicura (ma, francamente, visto come è difficile la crittografia, ne dubito) dovrei vederne il codice...
Terzo: essendo la sicurezza della criptazione della password tutta data dalla sola funzione str_crypt, nuovamente siamo da capo, potresti stare salvandola in db con una criptazione troppo debole.
Quarto: anche la generazione casuale della password iniziale non è chiaro come tu la faccia, visto che di nuovo anche generateRandomString() è una tua funzione non parte di PHP; anche questo può aprire a falle di sicurezza, dato anche che non la fai cambiare, se ho capito bene...

Il modo corretto è questo: che la password venga scelta dall'utente (meglio, ma devi imporre un po' di clausole di complessità minima) o generata casualmente (ma allora devi usare delle vere funzioni random, NON vanno bene rand() o mt_rand(), DEVI usare cose come
random_int(), random_bytes(), o openssl_random_pseudo_bytes()) in ogni caso devi salvarla nel db dopo averla fatta criptare da password_hash().
Quando dovrai verificare un utente, lo cercherai SOLO tramite la sua username, ed userai password_verify($password_fornita_dall_utente,$pas sword_criptata_letta_dal_db) per verificare le credenziali.

3) Come dicevo, CIASCUN parametro dev'essere ripulito e reso non pericoloso secondo le sue regole: se un parametro è un codice numerico intero, allora può bastare intval, ma se il codice deve contenere anche lettere, allora ti devi premurare di filtrarlo in altro modo, usando per esempio le espressioni regolari per stabilire che sia fatto solo di certi caratteri e nient'altro.
Se invece il parametro dev'essere solo uno di una possibile serie di valori, allora devi controllare che sia uno di essi (per esempio, le provincie FI/BO/MI etc, le devi controllare in una lista di provincie).

4) strip_tags è nativa di php, ma è debole, gli altri sono librerie esterne, HTMLawed lo trovi qui
https://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/
E HTMLPurifier lo trovi qui
http://htmlpurifier.org/