URL kısaltıcı: iyi şifreleme yöntemi?

2 Cevap php

Ben bir bağlantı kısaltma servisi kuruyorum ve benim URL'ler oluşturmak için bir artırılır kimlik alanının base64 kodlama / kod çözme kullanıyorum. "6" kimliği ile bir url olacaktır: http://mysite.com/Ng==

Ben de kullanıcılar http://mysite.com/music gibi, özel bir url adı oluşturmak için izin gerekiyor

İşte benim (muhtemelen hatalı) yaklaşımı çok uzak. Bu duyacağız sabitleme yardımcı.

Birisi yeni bir bağlantı oluşturur:

  • Ben (bu otomatik artırılır değil) veritabanından büyük bağlantı kimliği almak
  • 1 ile kimliği artırmak
  • Bu kimliği base64_encoding tarafından kısa bir URL kod (http://website.com/ [url kısa adı]) oluşturun
  • Bağlantılar tabloya eklemek: id, short_url_code, DESTINATION_URL

Birisi yeni bir bağlantı oluşturur ve özel bir kısa URL geçtiğinde:

  • Planım kendi özel dize base64_decode ve bağlantı kimliği olarak kullanan, ama bir dizi içine base64_decode herhangi bir alfasayısal dize ve sadece açabilirsiniz fark etmedi edildi.

Bana kısa bir dizeye herhangi bir sayı dönelim ve bir dizi halinde herhangi bir dize olacak daha iyi bir kodlama yöntemi var mı, bu yüzden her zaman bir numara haline adını dönüm ve bir bağlantı için sorgulayarak (ister özel veya autogenerated) kısa adresler arama yapabilirsiniz Bu sayıya eşit bir kimliği ile?

2 Cevap

Birincisi ve en önemlisi, make sure you have unicity constraints in place ID ve short_url_code sütunlarda.

Birisi yeni bir bağlantı oluşturur:

  1. Veritabanından sonraki en büyük link ID alın (for performance reasons you should really REALLY use autoincrement veya SEQUENCE , depending on what your RDBMS offers; otherwise go ahead and select MAX(ID)+1)
  2. (http://website.com/[short url name]) ID kullanarak kısa bir URL kodu oluşturun base64_encode veya any diğer özel ya da standart kodlama şeması
  3. links tabloya eklemek: ID, short_url_code, destination_url
  4. Insert, çünkü bir kısıtlama ihlali nedeniyle başarısız olursa, yeni bir ID denemek için 1. adıma geri dönün; : Eğer bir ihlal nedeniyle olmuş olabilir

    1. aynı kimliği zaten, sen autoincrement veya SEQUENCE kullandıysanız bu not olacak (başka bir iş parçacığı / sürecine vs ile paralel olarak (yani takılı) kullanılır olmuştur ve) oldukça sık aksi ortaya çıkabilir, ve / veya
    2. (birisi sitenizde sorun neden çalışıyor sürece bu çok nadiren olur) aynı short_url_code zaten özel bir URL olarak kullanılmıştır
  5. Insert başarılı olursa, taahhüt ve kullanıcıya kısa bir URL dönüş

Birisi yeni bir bağlantı oluşturur ve özel bir kısa URL geçtiğinde:

  1. Yukarıdaki gibi aynı adımı 1 gerçekleştir
  2. Dan Instead of generating kısa URL kısmı ID aşama 2'de yukarıda, use the custom short_url_code kullanıcının tarafından sağlanan
  3. Yukarıdaki gibi aynı adımı 3 gerçekleştir
  4. If the insert failed because of:
    1. üzerinde bir kısıtlama ihlali ID: Yeni bir ID denemek için 1. adıma geri dönün
    2. short_url_code üzerinde bir kısıtlama ihlali: o / o sağlanan kısa URL olarak, farklı özel bir URL almak için onu soran kullanıcıya bir hata döndürür zaten kullanılıyor
  5. Yukarıdaki gibi aynı adımı 5 gerçekleştir

base64 kısa URL'ler yapmak için kullanılabilir, ama aynı zamanda url uzun yapabilirsiniz. Örneğin 1 numaralı base64_encode 4 kat boyutu 'MQ ==' dir. Base64 her zaman kısa URL'ler için ideal değildir 64bits, elde etmek için 2 karakter olacak.

Boyutu güvenerek kısa adresler üretmek için daha sonra belki mümkün en önemli faktör ise internationalization.

Bu (tek bir Unicode karakter için en fazla 9 ASCII karakterleri) bir tanım oldukça uzun yapabilir, ama niyeti tarayıcılar sadece dekod formunu görüntülemek gerekir ve birçok protokol HH kaçan% olmadan UTF-8 göndermesidir.

Tarayıcılar UTF-8 ile oldukça iyi çalışır, ve twitter bu adresler ile hiçbir sorun olacağını aklınızda bulundurun.