PHP Get URL üzerinden şifrelenmiş veri taşınması işlemi

Haktan AKDAĞ
4 min readAug 17, 2023

Merhaba arkadaşlar; Bu aralar güvenlik konularına kafayı takmış durumdayım, biraz üşengeçlikten, biraz da hızlı iş çıkarmak zorunda olduğum için php scriptim ile proje kodlarken, güvenlik açığı olabilecek nitelikte bir kavram üzerine biraz kafa yordum.

Aslında normalde bu tarz işlemler için yeni çıkan teknolojilerle, ANGULAR, REACT vs gibi UI araçlarını kullanarak kodlama yapsam oldukça verimli ve hızlı projeler çıkartabileceğimi düşünüyorum, fakat backend’ci ruhum söz konusu UI araçlarına hep uzak kalmak istediğinden, php ile sorunuma bir çare arayışında bulundum.

Sorun aslında çok basit, URL üzerinden get ile buton altına <a> tagları içine yazacağımız ./index.php?sayfaadi&duzenleId=2 url’indeki 2 değerini tahmin edilemez hale dönüştürmek gibi bir niyetim vardı. Normalde bu url üzerinden veri çağırma, editlenecek sayfaya veri taşıma işi için GUID kullanılır. Fakat yazacağım projenin veri tabanlarına GUID alanı eklemekten ziyade bu veriyi mantıklı bir şekilde şifrelesek ne olur diye düşündüm ve uygulamayı hayata geçirdim.

Kodlama sırasında kullandığım kodları bir fonksiyon haline getirdim ve o fonksiyonu sizlerle bu yazım da paylaşacağım.

Yukarıdaki gibi bir url’miz olsun. destekId=DQ== değeri aslında arka planda 1 değerine tekabül ediyor, fakat orada 1 yazsaydı, 2 nolu desteği incelemek için son kullanıcı URL kısmından 2 nolu desteğe ait kayıtları düzenleyebilecek yetkiye sahip olacaktı.

Burada backend tarafında yetkilendirme yapmalısın dediğinizi duyar gibiyim.

Elbette onu da yapacağım fakat önemli olan URL kısmında id numarasının tahmin edilemez bir durum olması benim için çok önemli.

Url üzerinden taşınan GET verileri, tahmin edileceği gibi ayrıca BOT programlama yapılarak sürekli zaafiyet ve saldırılara da açık bir olgu olacaktır.

Normal şartlar altında söz konusu GET kavramını gerek kitabımda, gerekse daha önceki yazdığım malalelerden de öğrenebilirsiniz.

$destekId=UnBanStr($destekId);

Bu kod bloğundaki UnBanStr fonksiyonunu da şimdi sizlerle paylaşacağım.

Fakat önce sizlere bu şifreleme methodundan bahsedeceğim.

PHP’de, şifrelemek ve şifresini çözmek için OpenSSL işlevi adı verilen Şifreleme Uzantılarından biri kullanılarak bir dizenin Şifrelenmesi ve Şifresinin Çözülmesi mümkündür. openssl_encrypt() İşlevi: Openssl_encrypt() işlevi, verileri şifrelemek için kullanılır.

string openssl_encrypt( string $veri, string $yöntem, string $anahtar,
$options = 0, string $iv, string $tag= NULL,
string $aad, int $tag_length = 16 )

parametreler:

  • $data: Şifrelenmesi gereken dizi veya verileri tutar.
  • $method: cipher yöntemi, openssl_get_cipher_methods() işlevi kullanılarak benimsenir.
  • $key: Şifreleme anahtarını tutar.
  • $options: OPENSSL_RAW_DATA ve OPENSSL_ZERO_PADDING bayraklarının bit düzeyinde ayrılmasını sağlar.
  • $iv: NULL olmayan başlatma vektörünü tutar.
  • $tag: AEAD şifre modu (GCM veya CCM) kullanılırken referans olarak iletilen kimlik doğrulama etiketini tutar.
  • $aad: Ek kimlik doğrulama verilerini tutar.
  • $tag_length: Kimlik doğrulama etiketinin uzunluğunu tutar. Kimlik doğrulama etiketinin uzunluğu, GCM modu için 4 ila 16 arasındadır.

Dönüş Değeri: Başarı durumunda şifrelenmiş dizeyi veya başarısızlık durumunda FALSE döndürür. openssl_decrypt() İşlevi Openssl_decrypt() işlevi, verilerin şifresini çözmek için kullanılır.

string openssl_decrypt( string $data, string $yöntem, string $key,
int $seçenekler = 0, string $iv, string $tag, string $aad)

Hedeflediğim çıktı böyle olmalı.

<?php

$gizlenecekdeger = "Merhaba Benim Adım Haktan";

echo "Original String: " . $gizlenecekdeger;
echo "<br>";

// Store the cipher method
$ciphering = "AES-128-CTR";

// Use OpenSSl Encryption method
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;

// Non-NULL Initialization Vector for encryption
$encryption_iv = '8569748526325697';

// Store the encryption key
$encryption_key = "Kızımın adı Gülce";

// Use openssl_encrypt() function to encrypt the data
$encryption = openssl_encrypt($gizlenecekdeger, $ciphering,
$encryption_key, $options, $encryption_iv);

// Display the encrypted string
echo "Encrypted String: " . $encryption . "\n";
echo "<br>";
// Non-NULL Initialization Vector for decryption
$decryption_iv = '8569748526325697';

// Store the decryption key
$decryption_key = "Kızımın adı Gülce";

// Use openssl_decrypt() function to decrypt the data
$decryption=openssl_decrypt ($encryption, $ciphering,
$decryption_key, $options, $decryption_iv);

// Display the decrypted string
echo "Decrypted String: " . $decryption;

?>

Bu bağlamda oluşturduğum fonksiyonlar;

<?php
Function BanStr($sifrelenecekdata){

//$simple_string = "Merhaba Benim Adım Haktan";

$ciphering = "AES-128-CTR";
// Use OpenSSl Encryption method
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
// Non-NULL Initialization Vector for encryption 16 Character Password
$encryption_iv = '1234567891011111';

// Store the encryption key
$encryption_key = "Kızımın Adı Gülce";

// Use openssl_encrypt() function to encrypt the data
$encryption = openssl_encrypt($sifrelenecekdata, $ciphering,
$encryption_key, $options, $encryption_iv);

return $encryption;
// Display the encrypted string
//echo "Encrypted String: " . $encryption . "\n";

// Non-NULL Initialization Vector for decryption
}
function UnBanStr($cozulecekdata){
$ciphering = "AES-128-CTR";
$decryption_iv = '1234567891011111'; //16 Character Password
$decryption_key = "Kızımın Adı Gülce";

// Use openssl_decrypt() function to decrypt the data
$decryption=openssl_decrypt ($cozulecekdata, $ciphering,
$decryption_key, $options, $decryption_iv);

// Display the decrypted string
return $decryption;
}
?>

Örnek projemdeki kullanım şeklim de şu şekilde;

Bu sayede artık URL’den GET methodu ile şifreli veri taşıyabileceğim.

Umarım faydalı olur.

İyi çalışmalar..

--

--