Per come la vedo io non esiste un sistema universale che vada bene in ogni caso. Piu' "universale" e' il metodo di filtraggio, meno e' sicuro e capillare. In sostanza bisogna valutare caso per caso in base ai tipi di dati che ti aspetti. Chiaramente la soluzione piu' sicura e' la whitelist, ma non e' sempre applicabile. La seconda scelta e' definire cosa e' accettabile (soluzione preferibile al definire cosa invece e' bandito): ad esempio, se il dato in ingresso e' uno username si puo' controllare che contenga solo caratteri alfanumerici con ctype_alnum(), se ci si attende un numero si puo' controllare che lo sia invece di usare un type cast e cosi' via. E' molto meglio rifiutare dati non conformi alle attese piuttosto che cercare di aggiustarli.
Inoltre dipende anche dall'uso che si deve fare dei dati in ingresso. Se cio' che viene da un $_POST dev'essere inserito in un database, non ha molto senso usare htmlentities() o simili: il codice html non e' in se' pericoloso se passato a un DB, quello deve essere filtrato come OUTPUT non come input. In quel caso piuttosto ha piu' senso usare strip_tags() perche' i casi sono due: o ti interessa il codice html (ma non ha senso registrarlo nel db gia' lavorato, lo registri cosi' com'e' e lo filtri quando lo invii in output al client) oppure il codice non ti interessa e allora non ha senso conservarlo.
Il tutto ovviamente IMHO