Làm thế nào để tạo UUIDs an toàn ngôn ngữ?


20

Tôi luôn muốn sử dụng các chuỗi được tạo ngẫu nhiên cho ID tài nguyên của mình, vì vậy tôi có thể có các URL ngắn hơn như thế này: / user / 4jz0k1

Nhưng tôi chưa bao giờ làm thế, vì tôi lo lắng về việc tạo chuỗi ngẫu nhiên tạo ra các từ thực tế, ví dụ: / user / f * cker. Điều này mang đến hai vấn đề: nó có thể gây nhầm lẫn hoặc thậm chí gây khó chịu cho người dùng và nó cũng có thể gây rắc rối với SEO.

Sau đó, tôi nghĩ rằng tất cả những gì tôi phải làm là thiết lập một mẫu cố định như thêm một số mỗi 2 chữ cái. Tôi rất hài lòng với phương thức 'created_safe_uuid' của mình, nhưng sau đó tôi nhận ra rằng nó chỉ tốt hơn cho SEO và tệ hơn cho người dùng, vì nó làm tăng tỷ lệ của các từ thực tế được tạo ra, ví dụ: / user / g4yd1ck5

Bây giờ tôi đang nghĩ rằng tôi có thể tạo ra một phương thức 'thay_numbers_with_letters' và kiểm tra xem nó có hình thành bất kỳ từ nào chống lại từ điển hoặc một cái gì đó không.

Còn ý tưởng nào khác không?

ps. Khi tôi viết bài này, tôi cũng nhận ra rằng việc kiểm tra các từ bằng nhiều ngôn ngữ (ví dụ: tiếng Anh và tiếng Pháp, tiếng Tây Ban Nha, v.v.) sẽ là một mớ hỗn độn và tôi lại bắt đầu yêu thích ID chỉ có số.

CẬP NHẬT

Một số liên kết mọi người nên đọc:

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

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


Sử dụng hàm băm hoặc tổng kiểm tra? Nếu bạn thích sử dụng một chuỗi ngẫu nhiên, không có quy tắc nào là bạn phải sử dụng mọi chữ cái trong bảng chữ cái.
Austin Henley

21
Đừng gọi nó là uuid, uuid là những định danh duy nhất trên toàn cầu. Nó đề cập đến một hệ thống định danh cụ thể mà bạn có thể sử dụng. Đó không phải là những gì bạn đang làm ở đây, vì vậy đừng sử dụng thuật ngữ đó.
Winston Ewert

4
Tôi sẽ chỉ để lại cho bạn câu chuyện về Trình tạo lời nguyền tự động
Scott Chamberlain

1
@HappyDeveloper, thứ nhất, nó không phổ quát. Nó là cụ thể cho ứng dụng của bạn. Thứ hai, uuid đặc biệt đề cập đến en.wikipedia.org/wiki/Universally_unique_identifier không phải bất kỳ sơ đồ tương tự nào bạn nghĩ ra.
Winston Ewert

2
Đây là một sự lãng phí đáng kinh ngạc của braintime. Cơ hội của nó thực sự xảy ra là quá nhỏ để có thể nghĩ đến ...
Michael Borgwardt

Câu trả lời:


6

Một vài lời khuyên sẽ làm giảm cơ hội vô tình tạo ra những từ có ý nghĩa:

  • Thêm một số ký tự không phải là alpha, không phải số vào hỗn hợp, chẳng hạn như "-", "!" hoặc là "_".
  • Soạn UUID của bạn bằng cách tích lũy chuỗi các ký tự (chứ không phải là các ký tự đơn) không có khả năng xảy ra trong các từ thực, chẳng hạn như "zx" hoặc "aa".

Đây là một số mã mẫu C # (sử dụng .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();  
}  

Điều này không đảm bảo rằng bạn sẽ không xúc phạm bất cứ ai, nhưng tôi đồng ý với @DeadMG rằng bạn không thể nhắm mục tiêu quá cao.


1
vấn đề với phi chữ và số là một số trong số chúng sẽ không chơi tốt trong các URI (dẫn đến ký tự thoát, một số không lớn trong một URL nhỏ: có một lý do với bit.ly và tinyurl không sử dụng chúng). Vấn đề khác là họ ít trực quan hơn với người dùng: họ không dễ dàng viết ra một bài đăng hoặc truyền trên điện thoại (nhiều người không chuyên về công nghệ không biết tên của gạch dưới là gì thí dụ). Một lần nữa, có một lý do tại sao url nhỏ và bit.ly không sử dụng chúng.
user988052

@ user988052: Do đó một số ký tự không phải là alpha, không phải là số. Thật dễ dàng để chọn một số ít phù hợp với URI và đủ dễ cho con người.
CesarGon

"Do đó một số ký tự không phải là alpha, không phải là số." dịch vụ rút ngắn [sic] ... URL (bit.ly, TinyURL, t.co, goo.gl, vv) dường như nghĩ rằng không phi alphanum là tốt hơn so với "số". Và tôi nghĩ rằng những lý do tôi giải thích trong các bình luận trước đây là một phần của lời giải thích về lý do tại sao các dịch vụ này không đồng ý với quan điểm của bạn. Bây giờ rõ ràng ý kiến ​​của chúng tôi khác nhau về vấn đề này và tôi sẽ để lại cho bạn từ cuối cùng; )
dùng988052

@ user988052: Tôi đã sử dụng goo.gl từ lâu và nó không bao giờ gặp vấn đề với việc chuyển đổi tất cả các loại ký tự không phải alpha; ngoại lệ duy nhất là%. Bạn có thể tìm thấy tài liệu này trong nhóm thảo luận của dịch vụ. Bạn có thể cung cấp bất kỳ tài liệu tham khảo sao lưu yêu cầu của bạn?
CesarGon

1
OP cho biết ông muốn tên ngắn và yêu cầu một phương pháp để tạo ra chúng. Bạn đề xuất "thêm các ký tự không phải là alpha, không phải số vào hỗn hợp" [sic]. Vì vậy, những gì bạn đang đề nghị? OP đó trước tiên tạo ra "cái gì đó" và sau đó gửi cái này đến tinyurl / bit.ly? Tôi nghĩ đó không phải là những gì OP đang theo đuổi. OP muốn trực tiếp tạo một URL tương đối "nhỏ". Tất cả những gì tôi đang nói là nếu đó là những gì anh ấy theo đuổi, thì có lẽ tốt hơn là anh ấy nên sử dụng bảng chữ cái chữ cái, giống như tinyurl / bit.ly đang làm! Bây giờ tôi thực sự tắt.
dùng988052

5

Chỉ cần tạo một danh sách từ nghịch ngợm, danh sách thay thế chữ cái và sau đó nếu bất kỳ ID nào được tạo là một từ nghịch ngợm, hãy làm lại nó.

Chẳng hạn (mã giả)

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

(Bạn có thể tham khảo các đề xuất url ngắn khác như đề xuất này để biết thông tin về băm / chuyển đổi cơ sở 62)

Bây giờ bạn không còn nhận được ID thích a55, sh1thoặc "b00bs". Danh sách thay thế chữ cái của bạn sẽ chỉ cần chứa các ký tự trong các từ nghịch ngợm của bạn, rõ ràng.

Vì không ai sẽ đọc "455" là "ass" nên bạn cũng có thể muốn return strvào reducestringnếu nó không chứa bất kỳ chữ cái nào.

Ví dụ

Trang web thiết kế đồ họa Dribbble có id chuỗi ngắn riêng cho bài viết. Chúng sử dụng 0-9, az và AZ như http://drbl.in/dCWi .

Tôi đã làm một số thử nghiệm và có những id ngắn cho ít nhất một vài từ nghịch ngợm. Tôi đoán chúng ta sẽ thấy khi họ đếnf , nhưng họ chưa ở đó.

Cấp - cung cấp cho người dùng url nhận dạng cá nhân của riêng họ ( /user/whatever) thay vì chỉ một bài đăng tồi tệ hơn nhiều với những từ ngữ nghịch ngợm.


2
Tôi đã từng viết một chương trình tạo mật khẩu cho một dịch vụ trực tuyến. Chúng là ngẫu nhiên, nhưng có một vài phương pháp phỏng đoán khiến chúng có thể phát âm được, vì vậy chúng sẽ dễ nhớ hơn. Và những heuristic này dẫn đến thô tục. Giải pháp đã được mô tả ở đây: kiểm tra các chuỗi con thô tục, bao gồm cả các từ có thể được phát âm tương tự như các từ thô tục (ví dụ: tìm FUC và FUK) và tạo lại mật khẩu. (Đối với những tiếng cười khúc khích, chương trình đã viết mật khẩu bị từ chối vào một tệp riêng.)
kindall

1
Và làm thế nào trên trái đất bạn sẽ viết một điều như vậy cho mọi ngôn ngữ ?
DeadMG

1
@DeadMG Đối với tập hợp đầy đủ của tất cả các từ xúc phạm có thể, điều này chỉ có thể làm cho tập hợp đó nhỏ hơn. Lập trường của bạn có thực sự: "bởi vì bạn không thể đạt tới 100%, nó tự động không đáng để làm gì cả"?
Nicole

Còn UTF-8 thì sao? Có rất nhiều ký tự in thay thế có được xung quanh sự thay thế này.
JBRWilkinson

1
@JBRWilkinson không áp dụng vì OP đang thiết lập bộ ký tự của các ký tự chữ và số cho ID, phải không?
Nicole

5

Thay vào đó, hãy xem xét sử dụng khóa số hoặc thập lục phân. Nó sẽ giúp bạn tiết kiệm rất nhiều rắc rối so với việc viết bộ lọc thô tục nhận thức i18n và điều tồi tệ nhất bạn sẽ phải lo lắng là thịt bò chết .


1
+1: Tôi nghĩ đây là giải pháp đơn giản và an toàn nhất. Bạn có thể tạo một uuid dưới dạng một số và sử dụng biểu diễn chuỗi cho nó (thập phân, thập lục phân, bát phân).
Giorgio

4
Bạn vẫn phải lo lắng về B16B00B5: P
CodeInChaos

3

Bạn không bao giờ có thể ngăn hệ thống tự động tạo ra một số chuỗi gây khó chịu cho người dùng. Ví dụ, ở Trung Quốc một số con số được coi là không may mắn.

Tất cả những gì bạn thực sự có thể làm là nói với người dùng rằng ID của họ là ngẫu nhiên và nội dung không liên quan và nếu họ nhận được /user/fuckerthì họ nên bỏ qua nó. Những điều này xảy ra và thật không khả thi về mặt kỹ thuật để tránh điều đó - giống như bạn không bao giờ có thể lọc thô tục.


9
Tôi không phải là người hạ bệ, nhưng tôi cảm thấy rất mạnh mẽ rằng đối với những lời xúc phạm bạn thực sự cần phải làm rất nhiều, rất nhiều, tốt hơn nhiều so với "nói với họ rằng họ nên bỏ qua nó". Ít nhất bạn có thể làm là cung cấp một số cách để thay đổi id được tạo thành một cái mà họ thấy chấp nhận được.
Marjan Venema

4
Tôi cũng không phải là người đánh giá thấp, nhưng tôi đồng ý với @MarjanVenema, / user / f * cker không được chấp nhận
HappyDeveloper

@HappyDeveloper: Như tôi đã đề xuất trước đây, bạn sẽ làm gì với nó? Bạn không thể ngăn người dùng được cung cấp ID mà họ thấy khó chịu.
DeadMG

3
@DeadMG Bạn có thể giúp đỡ tình hình bằng cách ngăn chặn một vài trường hợp thường gây khó chịu . Tôi nghĩ rằng câu hỏi ban đầu làm cho khá rõ ràng.
Nicole

2
@NickC: Các ví dụ duy nhất thường gây khó chịu bằng tiếng Anh . Bạn có biết những gì thường gây khó chịu trong tiếng Ả Rập, Bồ Đào Nha, Trung Quốc, Nga không? Không đề cập đến thực tế là những ngôn ngữ đó có thể có những từ chửi thề có nhiều, nhiều hình thức. Thật dễ dàng để đặc biệt các hình thức rõ ràng của các từ trong tiếng Anh, nhưng không dễ để làm điều đó cho mọi người.
DeadMG

2

Về cơ bản có hai chiến lược mà bạn có thể sử dụng:

  1. Tạo một hệ thống sẽ không tạo ra bất kỳ chuỗi tấn công nào. Ví dụ: bạn chỉ có thể soạn id của mình từ các chữ cái phụ âm. Bằng cách loại bỏ tất cả các nguyên âm, bạn có thể chắc chắn rằng hệ thống của bạn sẽ không bao giờ tạo ra bất kỳ từ tiếng Anh nào, nghịch ngợm hay nói cách khác.

  2. Sau khi tạo id hoàn toàn ngẫu nhiên, hãy kiểm tra để đảm bảo rằng id mới không bao gồm bất kỳ chuỗi con gây khó chịu nào.


1

Trong nhiều tình huống (spam email, chặn ip, v.v.), danh sách đen là một trò chơi thua - bạn sẽ không bao giờ có thể tạo một danh sách đen "hoàn chỉnh" về mọi điều xấu có thể xảy ra. a b c d e f

Nhiều người sử dụng danh sách trắng các từ có thể chấp nhận và xâu chuỗi chúng lại với nhau theo một thứ tự ngẫu nhiên. (Có lẽ với dấu gạch ngang hoặc dấu chấm hoặc khoảng trắng giữa mỗi từ).

Một số từ điển phổ biến được sử dụng để chuyển đổi các số tùy ý thành một chuỗi các từ có thể phát âm được bao gồm:


0

Bạn có thể làm cho nó chỉ là những con số được tạo ngẫu nhiên hoặc có một biểu thức chính quy để loại bỏ những con số gây khó chịu:

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

2
Buồn cười, vì tôi không bao giờ nghĩ một trong hai điều đó là xúc phạm.
DeadMG

Tôi biết rằng Đó chỉ là một chủ đề cảm động để đăng những lời chửi rủa thực sự trên một trang SE: meta.stackexchange.com/questions/22232/NH
Billjk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.