Come generare UUID "sicuri per la lingua"?

18

Ho sempre voluto usare stringhe generate casualmente per gli ID delle mie risorse, così avrei potuto avere URL più brevi come questo: / user / 4jz0k1

Ma non l'ho mai fatto, perché ero preoccupato per la generazione di stringhe casuali che creava parole reali, ad es .: / user / f * cker. Questo porta due problemi: potrebbe essere fonte di confusione o addirittura offensivo per gli utenti, e potrebbe anche compromettere il SEO.

Poi ho pensato che tutto quello che dovevo fare era impostare uno schema fisso come aggiungere un numero ogni 2 lettere. Ero molto soddisfatto del mio metodo 'generate_safe_uuid', ma poi ho capito che era solo migliore per SEO, e peggio per gli utenti, perché aumentava il rapporto tra le parole effettivamente generate, ad esempio: / user / g4yd1ck5

Ora penso che potrei creare un metodo 'replace_numbers_with_letters', e controllare che non abbia formato alcuna parola contro un dizionario o qualcosa del genere.

Qualche altra idea?

ps. Mentre scrivo questo, mi sono anche reso conto che il controllo delle parole in più di una lingua (es. Inglese e francese, spagnolo, ecc.) Sarebbe un disastro, e sto iniziando ad amare gli ID solo numeri di nuovo.

Aggiorna

Alcuni collegamenti dovrebbero essere letti:

link

link

    
posta HappyDeveloper 07.04.2012 - 17:37
fonte

7 risposte

5

Un paio di suggerimenti che ridurranno le possibilità di creare inavvertitamente parole significative:

  • Aggiungi alcuni caratteri non alfa e non numerici al mix, come "-", "!" o "_".
  • Componi i tuoi UUID accumulando sequenze di caratteri (anziché singoli caratteri) che è improbabile che si verifichino in parole reali, come "zx" o "aa".

Questo è un codice di esempio C # (utilizzando .NET 4):

private string MakeRandomString()  
{  
    var bits = new List<string>()  
    {  
            "a",  
            "b",  
            "c",  
            "d",  
            "e",  
            //keep going with letters.  
            "0",  
            "1",  
            "2",  
            "3",  
            //keep going with numbers.  
            "-",  
            "!",  
            "_",  
            //add some more non-alpha, non-numeric characters.  
            "zx",  
            "aa",  
            "kq",  
            "jr",  
            "yq",  
            //add some more odd combinations to the mix.  
    };  

    StringBuilder sb = new StringBuilder();  
    Random r = new Random();  
    for (int i = 0; i < 8; i++)  
    {  
        sb.Append(bits[r.Next(bits.Count)]);  
    }  

    return sb.ToString();  
}  

Questo non garantisce che non offenderai nessuno, ma sono d'accordo con @DeadMG che non puoi mirare così in alto.

    
risposta data 07.04.2012 - 18:13
fonte
4

Crea semplicemente un elenco di parole non veritiere, un elenco di sostituzione delle lettere e, in seguito, se un ID generato è una parola cattiva, rifai.

Ad esempio (pseudo codice)

naughty_words = ["ass", "shit", "boobs"]
substitutions = {
    "4" : "a"
    "1" : "i"
    "3" : "e"
    "7" : "t"
    "5" : "s"
    "0" : "o"
    // etc.
}

function reducestring (str) {
    newstr = ""
    for (character in str) {
        if (substitituions[character]) newstr += substitutions[character]
        else newstr += character
    }
    return tolower(newstr)
}

do {
    new_id_numeric = random_number()
    short_id = compress_to_alphanumeric(new_id_numeric) // 0-9, a-z, A-Z
    // that function should create a base 62 number
} while (!contains(naughty_words, reducestring(short_id))

(Puoi fare riferimento ad altri brevi consigli sull'URL come questo per informazioni sulla base 62 hashing / conversione)

Ora non hai più ID come a55 , sh1t o "b00bs". La tua lista di sostituzione delle lettere dovrebbe solo contenere caratteri nelle tue parole cattive, ovviamente.

Dato che nessuno leggerà "455" come "ass", potresti anche voler return str in reducestring se non contiene lettere.

Esempi

Il sito di progettazione grafica Dribbble ha i propri ID di stringa brevi per i post. Questi usano 0-9, a-z e A-Z come link .

Ho fatto alcuni esperimenti e ci sono id brevi per almeno alcune parole cattive. Immagino che vedremo quando arrivano a f , ma non ci sono ancora.

Concesso: dare a un utente il proprio URL di identificazione personale ( /user/whatever ) anziché solo un post è molto peggio con parole cattive.

    
risposta data 07.04.2012 - 19:04
fonte
4

Considera invece l'uso di una chiave numerica o esadecimale. Ti farà risparmiare un sacco di problemi rispetto alla scrittura di un filtro di profanità i18n-aware, e il peggio di cui ti devi preoccupare è morto manzo .

    
risposta data 08.04.2012 - 19:39
fonte
3

Non puoi mai impedire a un sistema automatico di generare una stringa che è offensiva per un utente. Ad esempio, in Cina alcuni numeri sono considerati sfortunati.

Tutto quello che puoi veramente fare è dire all'utente che il loro ID è casuale e il contenuto è irrilevante e se ottengono /user/fucker , dovrebbero semplicemente ignorarlo. Queste cose accadono e non è tecnicamente fattibile evitarlo, proprio come non puoi mai filtrare le volgarità.

    
risposta data 07.04.2012 - 17:45
fonte
2

Esistono essenzialmente due strategie che puoi utilizzare:

  1. Crea un sistema che non genererà stringhe offensive. Ad esempio, puoi comporre i tuoi ID solo da lettere di consonanti. Tralasciando tutte le vocali, puoi essere sicuro che il tuo sistema non genererà mai parole inglesi, birichine o altro.

  2. Dopo aver generato un ID completamente casuale, verifica che il nuovo id non includa sottostringhe offensive.

risposta data 08.04.2012 - 09:08
fonte
1

In molte situazioni (spam e-mail, blocco IP, ecc.), una lista nera è un gioco perdente - non sarai mai in grado di creare una lista nera "completa" di tutte le possibili cose brutte che potrebbero mai accadere. a b c d e f

Molte persone usano una lista bianca di parole accettabili e le stringa insieme in un ordine casuale. (Forse con un trattino o un punto o uno spazio tra ogni parola).

Alcuni dizionari popolari che vengono utilizzati per convertire numeri arbitrari in una serie di parole pronunciabili includono:

risposta data 24.06.2012 - 18:47
fonte
0

Puoi creare numeri casuali o una regex per cancellare quelli che sono offensivi:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid
    
risposta data 08.04.2012 - 17:54
fonte

Leggi altre domande sui tag