Penso che sia bello che tu desideri proteggere la privacy di un utente, ma ciò che stai costruendo sembra essere contrario alla protezione della privacy, quindi non penso che sia possibile farlo con una semplice configurazione (es. url di invio client, in qualsiasi forma, direttamente al tuo servizio di back-end).
Come altri hanno notato, l'hashing che utilizza sha1 è un buon primo passo, ma raggiunge solo la privacy contro gli umani rischiando di dare una rapida occhiata al database. Non ti dà molta privacy contro gli algoritmi progettati per analizzare i contenuti del database.
Stai perdendo anche più dell'URL visitato: l'utente ti dice anche a che ora era online e ha guardato l'url dato se stai facendo un controllo in tempo reale.
Alcuni altri hanno suggerito soluzioni per mitigare i problemi di privacy. Mentre sono tutti migliori di non fare nulla, non risolvono il problema. Ad esempio, la soluzione di Google che invia solo 32 bit dell'hash sembra carina, ma
che ancora associa solo tutti gli URL esistenti a una tabella hash con 4 miliardi di slot. Alcune di queste slot possono contenere un gran numero di voci, ma dal momento che non tutti gli URL sono visitati in modo uguale (ad esempio, gli URL di Facebook sono più visitati rispetto a quelli di qualche scuola primaria) e gli URL di un singolo dominio saranno molto probabilmente verrà eseguito un hash in modo abbastanza equo sui 4 miliardi di slot disponibili, sarà comunque abbastanza facile da indovinare, dato un insieme di url completi che ha lo stesso prefisso a 32 bit, quale URL è stato effettivamente visitato (specialmente per google, che ha pagerank dati su un numero enorme di URL là fuori ...)
Un simile attacco coinvolge qualcuno che costruisce una tabella arcobaleno di URL a cui è interessato. Potresti renderlo più difficile
- Utilizzo di una funzione di hash della password anziché di sha1, che richiede molto tempo per calcolare l'hash, ma ciò significa che il plug-in del browser sembra non rispondere.
- Salatura degli hash. Ovviamente non si può dare a ogni utente il proprio sale, o tutti gli hash per lo stesso url forniti da diversi utenti saranno unici, molto probabilmente rendendo inutile l'applicazione. Ma più cresce la tua base di utenti, meno utenti hanno bisogno degli stessi valori di sale. Non proteggi ancora la privacy degli utenti, ma rendi più difficile calcolare le tabelle arcobaleno per scoprire esattamente quali URL sono stati visitati, e se qualcuno lo fa per il sale di un utente specifico, solo la privacy di tutti gli altri utenti che condividono il suo sale è compromesso.
Tuttavia, questo non aiuta ancora nulla nei casi in cui un utente malintenzionato non è interessato all'intero insieme di URL hash, ma desidera solo rispondere a domande molto specifiche (ad es. quali utenti hanno visitato gli URL appartenenti ai domini in una determinata "lista nera"?) Dal momento che tali query riguarderanno solo una breve lista (forse poche decine o poche centinaia di migliaia di URL, a seconda delle dimensioni della lista nera), è banale abbatterle ognuna in una piccola quantità di tempo, non importa quali contromisure si utilizzano per rallentarlo.
È peggio di così, perché molti siti web hanno solo alcuni punti di accesso comuni, il più probabile è solo il dominio seguito da un percorso vuoto. Altri percorsi comunemente visitati sono le pagine di accesso, le pagine dei profili ecc. Quindi il numero di URL necessari per l'hash per determinare se qualcuno ha visitato un dominio specifico è molto probabilmente molto piccolo. Se un aggressore lo fa, perderà gli utenti che hanno utilizzato un link diretto in un sito web, ma ne prenderà la maggior parte.
Ed è anche peggio: se un utente malintenzionato riesce a trovare un URL completo da un hash fornito dall'utente, potrebbe facilmente ottenere tutti gli URL per gran parte della sessione di navigazione dell'utente. Come? Bene, dal momento che ha un URL, può dereferenziarlo con il suo ragno personalizzato, guardare tutti i link nel documento, cancellarli e cercarli nel tuo database. Quindi fa lo stesso con quei collegamenti e così via.
Quindi puoi fare alcune cose per renderlo più difficile, ma non credo che ci sia un modo per aggirare l'utente che deve fondamentalmente fidarsi di te con la sua cronologia di navigazione. L'unico modo per aggirare ciò che vedo è la creazione di un sistema distribuito non completamente sotto il tuo controllo e il suo utilizzo per raccogliere url, ad esempio una sorta di rete di mixer. Un'altra possibilità potrebbe essere quella di far scaricare ai client ampie parti del contenuto del database, nascondendo in tal modo gli URL a cui erano realmente interessati e fornire nuovi contenuti per il database solo in pacchetti di grandi dimensioni, il che almeno nasconderebbe il componente temporale della navigazione dell'utente .