Redis (Remote Dictionary Server) Clienti Kodlamak!

Bunjo

Uzman üye
14 Ara 2020
1,594
1,894
I Won

oqk18ir.png


c0sawob.png


lbn20fm.png
2q250vr.png


Merhabalar ben saldırı timlerinden Bunjo, bu konuda Redis'in ne olduğundan ve nasıl basit bir Redis clienti kodlanacağını anlatacağım.
Redis pek fazla bilinmediği için bu konu biraz tanım ağırlıklı olacaktır fakat tanımları az tutmaya çalışacağım.



Redis (Remote Dictionary Server)

iwxqmay.png


Redis, açık kaynaklı, anahtar-değer tabanlı bir veri deposu ve in-memory veritabanı sistemidir. Adı "Remote Dictionary Server"ın kısaltmasıdır.
Redis, NoSQL veritabanları kategorisine girer ve hızlı ve etkili bir şekilde veri saklamak, almak ve işlemek için tasarlanmıştır.


rxgk41n.png




nhqhx1j.png


Redis, bir anahtar-değer deposu ve in-memory veritabanı olarak kullanılır ve birçok faydası olabilir. Redis'in temel kullanım alanları:


Önbellek (Cache) Sistemi: Redis, sık kullanılan verileri hızlı bir şekilde saklayarak, web uygulamalarında önbellekleme için yaygın olarak kullanılır.
Bu, veritabanı erişimini azaltır ve uygulamanın performansını artırır.


Sıralama ve Listeleme: Redis, listeleri ve sıralı küme veri yapılarını destekler. Bu özellik sayesinde, sıralı veriye ihtiyaç duyan uygulamalarda
(örneğin, zaman damgaları, puanlama sistemleri) kullanılabilir.


Oturum Yönetimi: Redis, kullanıcı oturumları gibi durum bilgilerini hızlı bir şekilde saklamak için kullanılabilir.
Bu, web uygulamalarında kullanıcı oturumlarını yönetmek için sıklıkla tercih edilen bir senaryodur.


Gerçek Zamanlı Analitikler: Redis, hızlı ve anlık veri erişimine olanak tanıdığından, gerçek zamanlı analitik ve raporlama sistemlerinde kullanılabilir.
Örneğin, bir canlı etkinlik akışını izlemek veya gerçek zamanlı veri analizi yapmak için kullanılabilir.


Yüksek Performanslı Veritabanı: Redis, bellekte veri sakladığı için çok hızlı okuma ve yazma işlemleri sunar. Bu özellik, yüksek performans gerektiren uygulamalarda kullanılmasını sağlar.

Mesaj Kuyrukları ve Pub/Sub Mekanizması: Redis, basit bir yayın/abone (Pub/Sub) sistemi ve mesaj kuyrukları oluşturmak için kullanılabilir.
Bu, asenkron işlemleri desteklemek ve farklı bileşenler arasında iletişim kurmak için kullanılır.


Geçici Veri Depolama: Redis, geçici veri depolamak ve bu verilere belirli bir süre sonra otomatik olarak son vermek için kullanılır. Bu özellik, örneğin bir belirleme süresi olan geçici veri ihtiyacı olan durumlar için uygundur.

Kısacası Redis neredeyse her konuda işinizi görebilir.



Redis Nasıl Çalışır?

iwxqmay.png


İlgili şema:

nrtlipr.jpg



Redis Sunucusunun Başlatılması: Redis istemcisini kullanmadan önce, bir Redis sunucusu başlatılmalıdır. Sunucu, redis-server komutu veya başka bir yöntemle başlatılabilir.

Redis bir istemci (client) tarafından Redis sunucusuna bağlandığında ve veri iletimi gerçekleştiğinde geçen adımları şu şekilde anlatabiliriz:


Redis İstemcisinin Başlatılması ve Sunucuya Bağlanma: Redis istemcisi, Redis sunucusuna bağlanmak için redis veya redis-rb gibi uygun bir Ruby kütüphanesini kullanır. İstemci,
sunucunun IP adresi ve port numarası gibi bağlantı bilgilerini kullanarak bağlantı kurar.

Bash:
gem install redis

Ruby:
require 'redis'

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: '127.0.0.1', port: 6379)

Anahtar-Değer Çiftini Sunucuya Gönderme: İstemci, sunucuya bir anahtar-değer çiftini gönderir. Bu işlem, SET komutu gibi Redis komutları kullanılarak gerçekleştirilir.

Ruby:
# Anahtar-değer çiftini sunucuya gönderme
redis.set('bunjo_key', 'Bunjo, Redis!')

Veri Alma: İstemci, sunucudan bir anahtara karşılık gelen değeri alabilir. Bu işlem, GET komutu gibi Redis komutları kullanılarak gerçekleştirilir.

Ruby:
# Belirli bir anahtara karşılık gelen değeri alma
value = redis.get('bunjo_key')
puts value


Redis için basit bir iletişim bu şekilde gerçekleşir.


Redis İçin Veri Tipleri

iwxqmay.png


Redis içerisinde çokça veri tipi bulunur, en çok kullanılan veri tipleri:

String (Metin): Redis içinde en basit veri tipidir.

Ruby:
SET bunjo_key "Hello, Bunjo!"
GET bunjo_key

Hash (Hash): Anahtar-değer çiftlerini içeren bir veri yapısıdır.

Ruby:
HSET user:1000 username "bunjowtf"
HSET user:1000 email "[email protected]"
HGET user:1000 username

List (Liste): Sıralı bir liste içerir ve elemanlar eklenme sırasına göre sıralanır.

Ruby:
LPUSH mylist "item1"
LPUSH mylist "item2"
LRANGE mylist 0 -1


Set (Küme): Kısacası sırasız ve benzersiz elemanlara sahip bir küme.

Ruby:
SADD myset "member1"
SADD myset "member2"
SMEMBERS myset

Sorted Set (Sıralı Küme): Küme veri tipinden elemanlarının sıralı olması dışında bir farkı farkı yoktur.

Ruby:
ZADD myscores 100 "player1"
ZADD myscores 200 "player2"
ZRANGE myscores 0 -1 WITHSCORES


Redis İçin Client Kodlamak

93js8oc.png


Evet sonunda tanımlar bittiğine göre artık bir client kodlayabiliriz.
Eğer bir Redis sunucunuz yoksa bu kodu sadece okumanız sizin için yeterli olabilir çünkü kurması uzun bir süreçtir.

Kodlar:

İlk öncelikle kullanacağımız "redis" gemini yüklememiz gerekiyor.

Rich (BB code):
gem install redis

Şimdi ise içeriye aktaralım.

Ruby:
require 'redis'

Kullanıcının gireceği IP adresi ve Port üzerinden redis'e bağlantı kuralım.


Ruby:
# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp

print "Redis sunucu portu: "
redis_port = gets.chomp.to_i

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)

Kullanıcı yapmak istediği seçenekleri seçmesi için ekran.

Ruby:
def display_menu
  puts "1. String veri eklemek"
  puts "2. List elemanı eklemek"
  puts "3. Set üyesi eklemek"
  puts "4. Hash alanı eklemek"
  puts "5. ZSET üyesi eklemek"
  puts "6. Çıkış"
end

Kodun bir işlem yapıp kapanmaması için döngüye alalım ve seçenekleri yansıtalım.

Ruby:
loop do
  display_menu
  print "Yapmak istediğiniz işlemi seçin (1-6): "
  choice = gets.chomp.to_i

Case-when ile seçenek kontrolü yapıyoruz ve seçeneğe göre sunucuda komutu çalıştırıyoruz.

Ruby:
case choice
  when 1
    print "Anahtar için bir değer girin: "
    key_value = gets.chomp
    redis.set('mykey', key_value)
    puts "GET mykey: #{redis.get('mykey')}"

Kodun devamı bu şekilde metodları inceleyebilirsiniz.

Ruby:
when 2
    print "Liste elemanı eklemek için bir değer girin: "
    list_item = gets.chomp
    redis.rpush('mylist', list_item)
    puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
  when 3
    print "Set üyesi eklemek için bir değer girin: "
    set_member = gets.chomp
    redis.sadd('myset', set_member)
    puts "SMEMBERS myset: #{redis.smembers('myset')}"
  when 4
    print "Hash alanı eklemek için bir değer girin (alan:değer): "
    hash_input = gets.chomp.split(":")
    redis.hset('myhash', hash_input[0], hash_input[1])
    puts "HGETALL myhash: #{redis.hgetall('myhash')}"
  when 5
    print "ZSET üyesi eklemek için bir değer girin: "
    zset_member = gets.chomp
    print "ZSET üye puanını girin: "
    zset_score = gets.chomp.to_i
    redis.zadd('myscores', zset_score, zset_member)
    puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
  when 6
    puts "Çıkış yapılıyor..."
    break

Eğer 1-6 arası değer girilmeze.

Ruby:
else
    puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
  end
end

Tüm Kod:

Ruby:
require 'redis'

def display_menu
  puts "1. String veri eklemek"
  puts "2. List elemanı eklemek"
  puts "3. Set üyesi eklemek"
  puts "4. Hash alanı eklemek"
  puts "5. ZSET üyesi eklemek"
  puts "6. Çıkış"
end

# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp

print "Redis sunucu portu: "
redis_port = gets.chomp.to_i

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)

loop do
  display_menu
  print "Yapmak istediğiniz işlemi seçin (1-6): "
  choice = gets.chomp.to_i

  case choice
  when 1
    print "Anahtar için bir değer girin: "
    key_value = gets.chomp
    redis.set('mykey', key_value)
    puts "GET mykey: #{redis.get('mykey')}"
  when 2
    print "Liste elemanı eklemek için bir değer girin: "
    list_item = gets.chomp
    redis.rpush('mylist', list_item)
    puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
  when 3
    print "Set üyesi eklemek için bir değer girin: "
    set_member = gets.chomp
    redis.sadd('myset', set_member)
    puts "SMEMBERS myset: #{redis.smembers('myset')}"
  when 4
    print "Hash alanı eklemek için bir değer girin (alan:değer): "
    hash_input = gets.chomp.split(":")
    redis.hset('myhash', hash_input[0], hash_input[1])
    puts "HGETALL myhash: #{redis.hgetall('myhash')}"
  when 5
    print "ZSET üyesi eklemek için bir değer girin: "
    zset_member = gets.chomp
    print "ZSET üye puanını girin: "
    zset_score = gets.chomp.to_i
    redis.zadd('myscores', zset_score, zset_member)
    puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
  when 6
    puts "Çıkış yapılıyor..."
    break
  else
    puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
  end
end

Siz kendi istemcinizi geliştirip daha detaylandırabilirsiniz.
Okuyan herkese teşekkür ediyorum.

Ekstra olarak bilgi edinmek isterseniz bir doküman bıraktım.
 

AngelRayt

Uzman üye
13 Eki 2015
1,352
15
Python
Güzel bir konuya değinmişsin, şuanda redisi mikroservisler arası iletişimden tut sql cachlemeye kadar her alanda kullanıyoruz (y)
 

Butcherb3y

Uzman üye
1 Eyl 2022
1,617
1,199
Anıtkabir

oqk18ir.png


c0sawob.png


lbn20fm.png
2q250vr.png


Merhabalar ben saldırı timlerinden Bunjo, bu konuda Redis'in ne olduğundan ve nasıl basit bir Redis clienti kodlanacağını anlatacağım.
Redis pek fazla bilinmediği için bu konu biraz tanım ağırlıklı olacaktır fakat tanımları az tutmaya çalışacağım.



Redis (Remote Dictionary Server)

iwxqmay.png


Redis, açık kaynaklı, anahtar-değer tabanlı bir veri deposu ve in-memory veritabanı sistemidir. Adı "Remote Dictionary Server"ın kısaltmasıdır.
Redis, NoSQL veritabanları kategorisine girer ve hızlı ve etkili bir şekilde veri saklamak, almak ve işlemek için tasarlanmıştır.


rxgk41n.png




nhqhx1j.png


Redis, bir anahtar-değer deposu ve in-memory veritabanı olarak kullanılır ve birçok faydası olabilir. Redis'in temel kullanım alanları:


Önbellek (Cache) Sistemi: Redis, sık kullanılan verileri hızlı bir şekilde saklayarak, web uygulamalarında önbellekleme için yaygın olarak kullanılır.
Bu, veritabanı erişimini azaltır ve uygulamanın performansını artırır.


Sıralama ve Listeleme: Redis, listeleri ve sıralı küme veri yapılarını destekler. Bu özellik sayesinde, sıralı veriye ihtiyaç duyan uygulamalarda
(örneğin, zaman damgaları, puanlama sistemleri) kullanılabilir.


Oturum Yönetimi: Redis, kullanıcı oturumları gibi durum bilgilerini hızlı bir şekilde saklamak için kullanılabilir.
Bu, web uygulamalarında kullanıcı oturumlarını yönetmek için sıklıkla tercih edilen bir senaryodur.


Gerçek Zamanlı Analitikler: Redis, hızlı ve anlık veri erişimine olanak tanıdığından, gerçek zamanlı analitik ve raporlama sistemlerinde kullanılabilir.
Örneğin, bir canlı etkinlik akışını izlemek veya gerçek zamanlı veri analizi yapmak için kullanılabilir.


Yüksek Performanslı Veritabanı: Redis, bellekte veri sakladığı için çok hızlı okuma ve yazma işlemleri sunar. Bu özellik, yüksek performans gerektiren uygulamalarda kullanılmasını sağlar.

Mesaj Kuyrukları ve Pub/Sub Mekanizması: Redis, basit bir yayın/abone (Pub/Sub) sistemi ve mesaj kuyrukları oluşturmak için kullanılabilir.
Bu, asenkron işlemleri desteklemek ve farklı bileşenler arasında iletişim kurmak için kullanılır.


Geçici Veri Depolama: Redis, geçici veri depolamak ve bu verilere belirli bir süre sonra otomatik olarak son vermek için kullanılır. Bu özellik, örneğin bir belirleme süresi olan geçici veri ihtiyacı olan durumlar için uygundur.

Kısacası Redis neredeyse her konuda işinizi görebilir.



Redis Nasıl Çalışır?

iwxqmay.png


İlgili şema:

nrtlipr.jpg



Redis Sunucusunun Başlatılması: Redis istemcisini kullanmadan önce, bir Redis sunucusu başlatılmalıdır. Sunucu, redis-server komutu veya başka bir yöntemle başlatılabilir.

Redis bir istemci (client) tarafından Redis sunucusuna bağlandığında ve veri iletimi gerçekleştiğinde geçen adımları şu şekilde anlatabiliriz:


Redis İstemcisinin Başlatılması ve Sunucuya Bağlanma: Redis istemcisi, Redis sunucusuna bağlanmak için redis veya redis-rb gibi uygun bir Ruby kütüphanesini kullanır. İstemci,
sunucunun IP adresi ve port numarası gibi bağlantı bilgilerini kullanarak bağlantı kurar.

Bash:
gem install redis

Ruby:
require 'redis'

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: '127.0.0.1', port: 6379)

Anahtar-Değer Çiftini Sunucuya Gönderme: İstemci, sunucuya bir anahtar-değer çiftini gönderir. Bu işlem, SET komutu gibi Redis komutları kullanılarak gerçekleştirilir.

Ruby:
# Anahtar-değer çiftini sunucuya gönderme
redis.set('bunjo_key', 'Bunjo, Redis!')

Veri Alma: İstemci, sunucudan bir anahtara karşılık gelen değeri alabilir. Bu işlem, GET komutu gibi Redis komutları kullanılarak gerçekleştirilir.

Ruby:
# Belirli bir anahtara karşılık gelen değeri alma
value = redis.get('bunjo_key')
puts value


Redis için basit bir iletişim bu şekilde gerçekleşir.


Redis İçin Veri Tipleri

iwxqmay.png


Redis içerisinde çokça veri tipi bulunur, en çok kullanılan veri tipleri:

String (Metin): Redis içinde en basit veri tipidir.

Ruby:
SET bunjo_key "Hello, Bunjo!"
GET bunjo_key

Hash (Hash): Anahtar-değer çiftlerini içeren bir veri yapısıdır.

Ruby:
HSET user:1000 username "bunjowtf"
HSET user:1000 email "[email protected]"
HGET user:1000 username

List (Liste): Sıralı bir liste içerir ve elemanlar eklenme sırasına göre sıralanır.

Ruby:
LPUSH mylist "item1"
LPUSH mylist "item2"
LRANGE mylist 0 -1


Set (Küme): Kısacası sırasız ve benzersiz elemanlara sahip bir küme.

Ruby:
SADD myset "member1"
SADD myset "member2"
SMEMBERS myset

Sorted Set (Sıralı Küme): Küme veri tipinden elemanlarının sıralı olması dışında bir farkı farkı yoktur.

Ruby:
ZADD myscores 100 "player1"
ZADD myscores 200 "player2"
ZRANGE myscores 0 -1 WITHSCORES


Redis İçin Client Kodlamak

93js8oc.png


Evet sonunda tanımlar bittiğine göre artık bir client kodlayabiliriz.
Eğer bir Redis sunucunuz yoksa bu kodu sadece okumanız sizin için yeterli olabilir çünkü kurması uzun bir süreçtir.

Kodlar:

İlk öncelikle kullanacağımız "redis" gemini yüklememiz gerekiyor.

Rich (BB code):
gem install redis

Şimdi ise içeriye aktaralım.

Ruby:
require 'redis'

Kullanıcının gireceği IP adresi ve Port üzerinden redis'e bağlantı kuralım.


Ruby:
# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp

print "Redis sunucu portu: "
redis_port = gets.chomp.to_i

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)

Kullanıcı yapmak istediği seçenekleri seçmesi için ekran.

Ruby:
def display_menu
  puts "1. String veri eklemek"
  puts "2. List elemanı eklemek"
  puts "3. Set üyesi eklemek"
  puts "4. Hash alanı eklemek"
  puts "5. ZSET üyesi eklemek"
  puts "6. Çıkış"
end

Kodun bir işlem yapıp kapanmaması için döngüye alalım ve seçenekleri yansıtalım.

Ruby:
loop do
  display_menu
  print "Yapmak istediğiniz işlemi seçin (1-6): "
  choice = gets.chomp.to_i

Case-when ile seçenek kontrolü yapıyoruz ve seçeneğe göre sunucuda komutu çalıştırıyoruz.

Ruby:
case choice
  when 1
    print "Anahtar için bir değer girin: "
    key_value = gets.chomp
    redis.set('mykey', key_value)
    puts "GET mykey: #{redis.get('mykey')}"

Kodun devamı bu şekilde metodları inceleyebilirsiniz.

Ruby:
when 2
    print "Liste elemanı eklemek için bir değer girin: "
    list_item = gets.chomp
    redis.rpush('mylist', list_item)
    puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
  when 3
    print "Set üyesi eklemek için bir değer girin: "
    set_member = gets.chomp
    redis.sadd('myset', set_member)
    puts "SMEMBERS myset: #{redis.smembers('myset')}"
  when 4
    print "Hash alanı eklemek için bir değer girin (alan:değer): "
    hash_input = gets.chomp.split(":")
    redis.hset('myhash', hash_input[0], hash_input[1])
    puts "HGETALL myhash: #{redis.hgetall('myhash')}"
  when 5
    print "ZSET üyesi eklemek için bir değer girin: "
    zset_member = gets.chomp
    print "ZSET üye puanını girin: "
    zset_score = gets.chomp.to_i
    redis.zadd('myscores', zset_score, zset_member)
    puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
  when 6
    puts "Çıkış yapılıyor..."
    break

Eğer 1-6 arası değer girilmeze.

Ruby:
else
    puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
  end
end

Tüm Kod:

Ruby:
require 'redis'

def display_menu
  puts "1. String veri eklemek"
  puts "2. List elemanı eklemek"
  puts "3. Set üyesi eklemek"
  puts "4. Hash alanı eklemek"
  puts "5. ZSET üyesi eklemek"
  puts "6. Çıkış"
end

# Kullanıcıdan Redis sunucu bilgilerini al
print "Redis sunucu IP adresi: "
redis_host = gets.chomp

print "Redis sunucu portu: "
redis_port = gets.chomp.to_i

# Redis istemcisini başlatma ve sunucuya bağlanma
redis = Redis.new(host: redis_host, port: redis_port)

loop do
  display_menu
  print "Yapmak istediğiniz işlemi seçin (1-6): "
  choice = gets.chomp.to_i

  case choice
  when 1
    print "Anahtar için bir değer girin: "
    key_value = gets.chomp
    redis.set('mykey', key_value)
    puts "GET mykey: #{redis.get('mykey')}"
  when 2
    print "Liste elemanı eklemek için bir değer girin: "
    list_item = gets.chomp
    redis.rpush('mylist', list_item)
    puts "LRANGE mylist: #{redis.lrange('mylist', 0, -1)}"
  when 3
    print "Set üyesi eklemek için bir değer girin: "
    set_member = gets.chomp
    redis.sadd('myset', set_member)
    puts "SMEMBERS myset: #{redis.smembers('myset')}"
  when 4
    print "Hash alanı eklemek için bir değer girin (alan:değer): "
    hash_input = gets.chomp.split(":")
    redis.hset('myhash', hash_input[0], hash_input[1])
    puts "HGETALL myhash: #{redis.hgetall('myhash')}"
  when 5
    print "ZSET üyesi eklemek için bir değer girin: "
    zset_member = gets.chomp
    print "ZSET üye puanını girin: "
    zset_score = gets.chomp.to_i
    redis.zadd('myscores', zset_score, zset_member)
    puts "ZRANGE myscores: #{redis.zrange('myscores', 0, -1, with_scores: true)}"
  when 6
    puts "Çıkış yapılıyor..."
    break
  else
    puts "Geçersiz seçim. Lütfen 1-6 arasında bir seçenek girin."
  end
end

Siz kendi istemcinizi geliştirip daha detaylandırabilirsiniz.
Okuyan herkese teşekkür ediyorum.

Ekstra olarak bilgi edinmek isterseniz bir doküman bıraktım.
Elinize sağlık
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.