Laravel, veri tabanı birincil anahtarı olarak aksi belirtilmedikçe otomatik artan tamsayılar kullanmaktadır. Bu, genelde ihtiyacı karşılayan basit ve etkili bir çözümdür. Fakat biraz daha güvenlik gerekiyorsa, otomatik artan tamsayıları UUID ile değiştirebiliriz.

Auto-Increment ile ilgili problem ne?

Laravel, model verilerini kaydederken, belirtici olarak otomatik artan (auto-increment) tamsayılar kullanır. Bu hem veritabanı tarafında oldukça verimlidir, hem de kolay indekslenebildiğinden oldukça performanslı çalışır. 

Buradaki sorun oluşturabilecek şey kolay tahmin edilebilirliktir. Örneğin size erişim yetkisi verilmiş bir belgenin otomatik atanmış numarası 1045 olsun. Bu belgeye de "www.domain.com/belge/1045" adresi ile ulaştığınızı varsayalım.  Bu adrese bakarak, 1044 ya da 1046 numaralı belgelerin de sistemde varolabileceğini tahmin edebilir ve sadece adresi değiştirerek bu belgeleri çağırabilirsiniz. Eğer gerekli önlemler alınmamışsa yetkisiz erişim sorunları ile karşılaşmak çok olasıdır.

UUID nedir?

Eşsiz belirtici (Unique Identifier) güvenliğini sağlamak için öne çıkan yaklaşımlardan birisi UUID kullanımıdır. UUID (Universally Unique Identifier) kullanımının temel amacı, evrensel olarak eşsiz, fakat tahmin edilmesi zor bir belirtici oluşturmaktır. Belli bir algoritmanın çalışması sonucunda size sadece o ortam ve o ana özgü 128 bitlik bir kod oluşturulur. Fakat bu kodun en önemli özelliği, her üretildiğinde bir önceki koddan ciddi bir şekilde farklı olmasıdır. Bunun sonucunda veri belirtici olarak UUID kullanılması, tahmin edilebilirliği neredeyse imkansız hale getirir.

Laravel ile UUID nasıl üretilir?

Laravel, 5.6 versiyonu ile birlikte UUID üreten metodları helper olarak kullanıma sunmuştur.

// Standard UUID
Str::uuid() 

// Indexleme için optimize sıralı UUID
Str::orderedUuid()

Laravel Tinker ile birkaç saniye arayla üretilen 3 ayrı UUID:

>>> Str::uuid()->toString()
=> "016ff523-6b15-49a8-aa03-f74f51770d55"

>>> Str::uuid()->toString()
=> "fef06c81-1316-416d-b225-783d425a7e4f"

>>> Str::uuid()->toString()
=> "b6977b75-8cb6-415c-976e-c7bf87814561"

Migration ile tabloda UUID alanı oluşturma

Laravel, tablolarda UUID kaydetmeye uygun alanları oluşturmaya yönelik metodları kullanıma sunmuştur. Böylece tablo oluşturan ya da düzenleyen migrasyon dosyalarında kolayca UUID alanı oluşturabiliriz.

Aşağıda, UUID alanının primary key olarak kullanıldığı bir tablo oluşturmaya yönelik örnek migrasyon kodu görülüyor:

Schema::create('assets', function (Blueprint $table) {
  $table->uuid('id')->primary();
  $table->string('name');
  $table->timestamps();
});

Sonuç

Özellikle bulut bilişim teknolojilerinin yaygınlaşması ile birlikte bazı web servisleri milyonlarca, hatta milyarlarca kullanıcıya hizmet vermeye başladı. Her an, çok çeşitli kaynaklardan üretilen kaynakların eşsiz ve tahmin edilemez biçimde isimlendirilmesi amacıyla üretilmiş olan UUID kodları endüstri standardı olarak kullanılmaya başlanmıştır. Bu kodlama sisteminin en önde gelen kullanıcılarından birisinin de Microsoft olduğunu söylersem, sanıyorum şaşırmazsınız. Microsoft Azure, Microsoft 365, Dynamics 365 gibi her türlü bulut uygulamadaki resource lar UUID'ler ile isimlendirilmektedir.