“Dil açısından güvenli” UUID'ler nasıl oluşturulur?


20

Her zaman kaynaklarımın kimlikleri için rastgele oluşturulmuş dizeler kullanmak istedim, bu yüzden daha kısa URL'lere sahip olabilirim: / user / 4jz0k1

Ama hiç yapmadım, çünkü gerçek kelimeler yaratan rastgele dizgi oluşturma konusunda endişeliydim, örneğin: / user / f * cker. Bu iki sorun getiriyor: kullanıcılar için kafa karıştırıcı hatta rahatsız edici olabilir ve SEO ile de karışıklık yaşayabilir.

Sonra tek yapmam gereken her 2 harften bir sayı eklemek gibi sabit bir model oluşturmak olduğunu düşündüm. Benim 'create_safe_uuid' yöntemi ile çok mutlu oldu, ama sonra sadece SEO için daha iyi ve kullanıcılar için daha kötü olduğunu fark ettim, çünkü üretilen gerçek kelimelerin oranını artırdı, örneğin: / user / g4yd1ck5

Şimdi, 'replace_numbers_with_letters' yöntemini oluşturabileceğimi ve bir sözlüğe ya da başka bir şeye karşı herhangi bir kelime oluşturmadığını kontrol edebileceğimi düşünüyorum.

Başka fikir var mı?

ps. Bunu yazarken, birden fazla dilde (örneğin: ingilizce ve fransızca, ispanyolca, vb.) Kelimeleri kontrol etmenin bir karışıklık olacağını fark ettim ve tekrar sadece kimlikleri sevmeye başladım.

GÜNCELLEME

Herkesin okuması gereken bazı bağlantılar:

http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx


Karma veya sağlama toplamı mı kullanıyorsunuz? Rastgele bir dize kullanmayı tercih ederseniz, alfabedeki her harfi kullanmanız gereken bir kural yoktur.
Austin Henley

21
Buna uuid deme, uuid evrensel olarak benzersiz tanımlayıcılardır. Kullanabileceğiniz belirli bir tanımlayıcı sistemine karşılık gelir. Burada yaptığınız şey bu değil, bu yüzden bu terimi kullanmayın.
Winston Ewert


1
@HappyDeveloper, öncelikle evrensel değil. Uygulamanıza özgüdür. İkincisi, uuid özellikle en.wikipedia.org/wiki/Universally_unique_identifier 'a sizin tasarladığınız benzer bir şemaya değinmez.
Winston Ewert

2
Bu inanılmaz bir beyin ziyanı kaybı. Aslında gerçekleşme şansı, düşünmeye bile değmeyecek kadar küçük ...
Michael Borgwardt

Yanıtlar:


6

Yanlışlıkla anlamlı kelimeler oluşturma şansını azaltacak birkaç ipucu:

  • Karışıma "-", "!" Gibi alfa olmayan, sayısal olmayan karakterler ekleyin veya "_".
  • "Zx" veya "aa" gibi gerçek kelimelerle oluşması muhtemel olmayan karakter dizilerini (tek karakter yerine) biriktirerek UUID'lerinizi oluşturun.

Bu bazı C # örnek kod (.NET 4 kullanarak):

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();  
}  

Bu, kimseyi rahatsız etmeyeceğinizi garanti etmez, ancak @DeadMG ile bu kadar yüksek hedefleyemeyeceğinizi kabul ediyorum.


1
alfasayısal olmayan bir sorun, bazılarının URI'lerde güzel oynamamasıdır (küçük bir URL'de büyük bir hayır olan kaçan karaktere yol açar: bit.ly ve tinyurl'un bunları kullanmamasının bir nedeni vardır). Diğer sorun, kullanıcı için daha az sezgisel olmalarıdır: bir post-it'e yazmak veya telefonda iletmek kolay değildir (çoğu teknik olmayan, alt çizginin adının ne olduğu hakkında hiçbir fikri yoktur. misal). Bir kez daha minik url ve bit.ly'nin onları kullanmamasının bir nedeni var.
user988052

@ user988052: Bu nedenle bazı alfa olmayan, sayısal olmayan karakterler. URI'ler için iyi olan ve insanlar için yeterince kolay olan birkaç tanesini seçmek kolaydır.
CesarGon

"Bu nedenle bazı alfa olmayan, sayısal olmayan karakterler." [sic] ... URL kısaltma hizmetleri (bit.ly, tinyurl, t.co, goo.gl, vb.) sıfır alfanum olmayan "bazı" lardan daha iyi olduğunu düşünüyor . Ve daha önceki yorumlarımda açıkladığım nedenlerin, bu hizmetlerin sizin bakış açınıza neden katılmadığına ilişkin açıklamanın bir parçası olduğunu düşünüyorum. Şimdi açıkçası görüşümüzün bu konudaki farklılıkları ve size son sözü bırakacağım; )
user988052

@ user988052: Yaşlar boyunca goo.gl kullanıyorum ve alfa olmayan her türlü karakteri dönüştürme konusunda hiçbir sorun yaşamadım; tek istisna%. Bu belgeyi hizmetin tartışma grubunda bulabilirsiniz. Taleplerinizi destekleyen herhangi bir referans sağlayabilir misiniz?
CesarGon

1
OP kısa isimler istediğini ve bunları üretmek için bir yöntem istediğini söyledi. "Karışıma alfa olmayan, sayısal olmayan karakterler eklemenizi" öneririz [sic]. Ne öneriyorsun? O OP önce "bir şey" üretir ve sonra bunu tinyurl / bit.ly'e gönderir mi? Bence OP'nin peşinde olan bu değil. OP , nispeten "küçük" bir URL'yi doğrudan oluşturmak istiyor . Söylediğim tek şey peşinde olan şeyse, tıpkı tinyurl / bit gibi bir alfanum alfabesi kullanması daha iyi olabilir. Şimdi gerçekten gidiyorum.
kullanıcı988052

5

Sadece yaramaz bir kelime listesi, bir harf değiştirme listesi oluşturun ve sonra oluşturulan herhangi bir kimlik yaramaz bir kelime ise, tekrarlayın.

Örneğin (sözde kod)

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))

( Temel 62 karma / dönüşüm hakkında bilgi için bunun gibi diğer kısa url önerilerine başvurabilirsiniz )

Şimdi artık kimlikleri gibi olsun a55, sh1tveya "b00bs". Harf yerine koyma listenizde sadece yaramaz kelimelerinizde yer alan karakterler bulunmalıdır.

Kimse "eşek" olarak "455" okuyacak beri o zaman da isteyebilirsiniz return striçinde reducestringherhangi bir harf içermiyorsa.

Örnekler

Grafik tasarım sitesi Dribbble gönderiler için kendi kısa dize kimlikleri vardır. Bunlar, http://drbl.in/dCWi gibi 0-9, az ve AZ kullanır .

Biraz deneme yaptım ve en azından birkaç yaramaz kelime için kısa kimlikler var. Sanırım ne zaman ulaşacaklarını göreceğiz f, ama henüz orada değiller.

Verildi - bir kullanıcıya /user/whateversadece bir gönderi yerine kendi kişisel olarak tanımlayıcı url ( ) vermek yaramaz kelimelerle çok daha kötüdür.


2
Bir keresinde bir çevrimiçi hizmet için parola oluşturan bir program yazdım. Rastgele idi, ama onları sorta belirgin hale getiren birkaç sezgisel tarama vardı, bu yüzden daha kolay hatırlanacaklardı. Ve bu buluşsal yöntemler küfürlere yol açtı. Çözüm burada tarif edildiği gibiydi: kaba kelimelere benzer şekilde telaffuz edilebilecek olanlar da dahil olmak üzere kaba alt dizeleri kontrol edin (örn. FUC ve FUK'a bakın) ve şifreyi yeniden oluşturun. (
Kıkırdamalar

1
Ve nasıl her yerde böyle bir şey yazacaksınız ?
DeadMG

1
@DeadMG Olası tüm rahatsız edici kelimelerin tam seti için, bu sadece bu seti daha küçük yapabilir. Tutumunuz gerçekten: "% 100'e ulaşamadığınız için, otomatik olarak hiçbir şey yapmaya değmez" mi?
Nicole

UTF-8 ne olacak? Bu ikame ile uğraşan birçok alternatif yazdırılabilir grafik var.
JBRWilkinson

1
@JBRWilkinson, OP'nin kimlikler için alfasayısal karakterlerin karakter kümesini ayarlaması nedeniyle geçerli değil, değil mi?
Nicole

5

Bunun yerine sayısal veya onaltılık bir anahtar kullanmayı düşünün. Bir i18n bilinçli küfür filtresi yazmaya kıyasla size çok fazla sorun kazandıracak ve endişelenmeniz gereken en kötü şey sığır eti .


1
+1: Bence bu en basit ve en güvenli çözüm. Sayı biçiminde bir uuid oluşturabilir ve bunun için bir dize temsili kullanabilirsiniz (ondalık, onaltılık, sekizli).
Giorgio

4
Hala endişelenmeniz gerekiyor B16B00B5: P
CodesInChaos

3

Otomatik bir sistemin kullanıcıya saldırgan bir dize oluşturmasını hiçbir zaman engelleyemezsiniz. Örneğin, Çin'de bazı sayılar şanssız sayılır.

Gerçekten yapabileceğiniz tek şey kullanıcıya kimliğinin rastgele olduğunu ve içeriğin alakasız olduğunu söylemek ve eğer alırlarsa /user/fuckerbunu görmezden gelmeleri gerekir. Bu şeyler olur ve bundan kaçınmak teknik olarak mümkün değildir - tıpkı küfürü asla filtreleyemeyeceğiniz gibi.


9
Ben downvoter değilim, ama saldırgan sözler için gerçekten "onları görmezden gelmeleri gerektiğini söyle" den çok, çok, çok daha iyi yapmanız gerektiğini çok güçlü hissediyorum. Yapabileceğiniz en az şey, oluşturulan kimliği kabul edilebilir buldukları bir şekilde değiştirmek için bir yol sunmaktır.
Marjan Venema

4
Ben de downvoter değilim, ama @MarjanVenema ile hemfikirim, / user / f *
cker

@HappyDeveloper: Daha önce önerdiğim gibi, bu konuda ne yapacaksınız? Kullanıcılara rahatsız edici buldukları kimlikler verilmesini engelleyemezsiniz.
DeadMG

3
@DeadMG Yaygın olarak rahatsız edici birkaç vakayı önleyerek duruma yardımcı olabilirsiniz . Orijinal sorunun bunu oldukça netleştirdiğini düşündüm.
Nicole

2
@NickC: Sadece örnekler İngilizcede rahatsız edicidir . Arapça, Portekizce, Çince, Rusça'da yaygın olarak neyin rahatsız edici olduğuna dair bir fikrin var mı? Bu dillerin birçok, çok biçim alan küfürleri olabileceğinden bahsetmiyorum bile. İngilizce kelimelerin bariz biçimlerini özel olarak ele almak kolaydır, ancak bunu herkes için yapmak o kadar kolay değildir.
DeadMG

2

Kullanabileceğiniz iki temel strateji vardır:

  1. Rahatsız edici dizeler oluşturmayacak bir sistem oluşturun. Örneğin, kimliğinizi yalnızca ünsüz harflerden oluşturabilirsiniz. Tüm ünlüleri dışarıda bırakarak, sisteminizin asla yaramaz veya başka bir şekilde İngilizce kelimeler üretmeyeceğinden emin olabilirsiniz.

  2. Tamamen rastgele bir kimlik oluşturduktan sonra, yeni kimliğin rahatsız edici alt dizeler içermediğinden emin olun.


1

Birçok durumda (e-posta spam, ip engelleme, vb.), Bir kara liste kaybedilen bir oyundur - asla oluşabilecek her olası kötü şeyin "tam" bir kara listesini yapamazsınız. a b c d e f

Birçok kişi kabul edilebilir kelimelerin bir beyaz listesini kullanır ve bunları rastgele bir sırayla birleştirir. (Belki de her kelime arasında bir tire veya nokta veya boşluk).

Keyfi sayıları belirgin bir kelime dizisine dönüştürmek için kullanılan bazı popüler sözlükler şunları içerir:


0

Rastgele oluşturulmuş sayılar yapabilir veya rahatsız edici olanları iptal etmek için normal ifadeniz olabilir:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid

2
Komik, çünkü bunlardan hiçbirini rahatsız edici bulmam.
DeadMG

Biliyorum… Bir SE sitesinde gerçek lanet kelimeleri yayınlamak sadece dokunaklı bir konu: meta.stackexchange.com/questions/22232/…
Billjk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.