Kapatmak için ESC tuşuna basın

JavaScript Obfuscation: Kod Güvenliği ve Optimizasyonu

Web geliştiricileri, JavaScript dilini kullanarak güçlü ve interaktif web uygulamaları oluşturabilirler. Ancak, bu JavaScript kodları genellikle açık kaynak olarak sunulduğundan, geliştiricilerin kodlarını korumak ve kötü niyetli kullanımları önlemek adına ek önlemler alması gerekmektedir. Bu noktada, JavaScript obfuscation işlemi devreye girer.

JavaScript Obfuscation Nedir?

JavaScript obfuscation, kodu anlamayı zorlaştırmak amacıyla kodu karıştırma işlemidir. Bu işlem, kodun okunabilirliğini azaltır, ancak işlevselliğini ve performansını etkilemez. Obfuscation, kodunuzun mantığını anlamak isteyen kötü niyetli kişilere karşı bir engel oluşturarak, güvenlik düzeyini artırır.

Neden JavaScript Obfuscation Yapmalıyız?

1. Güvenlik

Obfuscation, kodunuzu okunması ve anlaşılması zor hale getirir, bu da potansiyel saldırganların kodunuzun iç çalışma mantığını anlamasını zorlaştırır. Bu, güvenlik açısından önemlidir, çünkü saldırganlar, kodunuzu inceleyerek güvenlik açıklarını keşfetmeye çalışabilirler.

2. Fikri Mülkiyet Koruması

Web uygulamaları genellikle birçok emek ve fikri mülkiyet içerir. Obfuscation, bu değerli bilgileri korumanın bir yoludur. Kodunuzu karıştırmak, özgün algoritmalarınızı ve özel çözümlerinizi koruyarak, başkalarının koddan kolayca yararlanmasını engeller.

3. Performans Optimizasyonu

Obfuscated kodlar, sıkıştırılmış ve optimize edilmiş formda olabilir. Bu, kodun boyutunu azaltabilir ve uygulamanızın yüklenme süresini optimize edebilir. Bu, özellikle düşük bant genişliği olan kullanıcılar için önemlidir.

4. Lisanslama ve Kullanım Kontrolü

JavaScript obfuscation, belirli işlevselliğin kullanımını kontrol etmenize yardımcı olabilir. Örneğin, belirli bir modülün sadece lisanslı kullanıcılara açık olmasını sağlamak için obfuscation kullanabilirsiniz.

JavaScript Obfuscation İşlemi

1. Minifikasyon

Kodun boyutunu küçültmek ve değişken isimlerini kısaltmak için minifikasyon adımı kullanılır. Bu adım, kodunuzun indirilme süresini azaltır ve ağ trafiğini optimize eder.

2. Değişken İsim Karıştırma

Değişken isimlerini rastgele karakterlere dönüştürmek, kodun okunabilirliğini azaltır. Bu adım, kodu anlamayı zorlaştırarak güvenliği artırır.

3. Fonksiyon Karıştırma

Fonksiyonları ve metodları rastgele isimlere dönüştürmek, kodun yapısını anlamayı daha da zorlaştırır.

4. String Karıştırma

Metin dizelerini şifreleyerek veya dönüştürerek, sabit değerleri gizlemek mümkündür. Bu adım, sabit değerlerin kötü niyetli kullanımını engellemeye yardımcı olur.

5. Kod Akışı Değiştirme

Obfuscation işlemi, kodun normal akışını değiştirerek, ters mühendislik girişimlerini zorlaştırabilir.

JavaScript-Obfuscator Kullanımı

JavaScript obfuscation işlemi için kullanılabilecek için, “javascript-obfuscator” adlı popüler bir kütüphaneyi ele alalım.

Bu işleme başlamadan önce NodeJS kurulu olmalıdır. Eğer NodeJS kurulu değilse nodejs resmi indirme sayfasını ziyaret edin.

1. Kütüphaneyi Global Olarak Yükleme

Aşağıdaki komutu kullanarak javascript-obfuscator kütüphanesini global olarak yükleyebilirsiniz:

Bash
npm install -g javascript-obfuscator
2. Obfuscation İşlemini Gerçekleştirin:

Obfuscation işlemi için komut satırında aşağıdaki gibi bir komut kullanabilirsiniz:

Bash
javascript-obfuscator --compact true --control-flow-flattening true --dead-code-injection true --unicode-escape-sequence true uygulama.js --output output_folder_name

Bu komut, belirtilen obfuscation ayarlarıyla birlikte verilen JavaScript dosyasını veya dizini doğrudan obfuscate ederek çıktı yapılacak klasöre atılır.

javascript-obfuscator kütüphanesinin sunduğu çeşitli parametreler sayesinde, obfuscation işlemini daha da özelleştirebilirsiniz. İşte bu parametrelerden bazıları:

  1. compact:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Kodun minifikasyonunu (küçültme) etkinleştirir. Minifikasyon, kodun boyutunu azaltır ve daha hızlı yüklenmesini sağlar.
  2. control-flow-flattening:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Kontrol akışını düzleştirme özelliğini etkinleştirir. Bu, kodun normal akışını değiştirerek ters mühendislik girişimlerini zorlaştırır.
  3. dead-code-injection:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Ölü kod enjeksiyonunu etkinleştirir. Bu, tarayıcı geliştirme araçlarını kullanarak kodun analizini zorlaştırır.
  4. unicode-escape-sequence:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Unicode kaçış dizisini etkinleştirir. Bu, karakterleri daha karmaşık hale getirerek okunabilirliği azaltır.
  5. self-defending:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Kendini savunma (self-defending) özelliğini etkinleştirir. Bu özellik, obfuscated kodun normal çalışmasını engelleyen saldırılara karşı koruma sağlar.
  6. string-array:
    • Tür: boolean
    • Varsayılan: false
    • Açıklama: Metin dizilerini şifreleyerek, sabit değerleri gizlemeyi sağlar. Bu, sabit değerlerin kötü niyetli kullanımını engellemeye yardımcı olur.

Bu parametreler, JavaScript kodunuzu isteğe bağlı olarak daha fazla güvenlik ve okunabilirlik özelliği eklemek için kullanılabilir.

Sadece komut satırı üzerinde kullanmak zorunda değilsiniz. NodeJS projenize dahil ederek kullanabilirsiniz.

JavaScript
const JavaScriptObfuscator = require('javascript-obfuscator');

// Obfuscation ayarları
const obfuscationOptions = {
    compact: true,
    controlFlowFlattening: true,
    deadCodeInjection: true,
    unicodeEscapeSequence: true,
};

// Obfuscate edilecek JavaScript kodu
const originalCode = `
    function merhaba() {
        console.log('Merhaba Dünya!');
    }
`;

// JavaScript kodunu obfuscate etme
const obfuscatedCode = JavaScriptObfuscator.obfuscate(originalCode, obfuscationOptions).getObfuscatedCode();

console.log(obfuscatedCode);
3. Örnek Kullanım:

Obfuscation işlemi öncesi kodu inceleyin:

JavaScript
// Matematiksel İşlemler
let sayi1 = 5;
let sayi2 = 10;
let toplam = sayi1 + sayi2;
let fark = sayi1 - sayi2;
let carpim = sayi1 * sayi2;
let bolum = sayi1 / sayi2;

// String İfadeler
let ad = "Bayram";
let soyad = "Alaçam";
let tamAd = ad + " " + soyad;

// If-Else Yapısı
if (sayi1 > sayi2) {
    console.log("sayi1, sayi2'den büyüktür.");
} else if (sayi1 < sayi2) {
    console.log("sayi2, sayi1'den büyüktür.");
} else {
    console.log("sayi1 ve sayi2 eşittir.");
}

// Switch-Case Yapısı
let gun = "Pazartesi";
switch (gun) {
    case "Pazartesi":
    case "Salı":
    case "Çarşamba":
    case "Perşembe":
    case "Cuma":
        console.log("Hafta içi günü.");
        break;
    case "Cumartesi":
    case "Pazar":
        console.log("Hafta sonu günü.");
        break;
    default:
        console.log("Geçersiz gün.");
}

Şimdi obfuscation işlemi sonrası kodu inceleyin:

JavaScript
const a0_0x605efa=a0_0x3aff;(function(_0x207924,_0x728546){const _0x106922=a0_0x3aff,_0x352ab4=_0x207924();while(!![]){try{const _0x37f0cd=-parseInt(_0x106922(0x9f))/0x1*(-parseInt(_0x106922(0xa7))/0x2)+-parseInt(_0x106922(0xa1))/0x3*(parseInt(_0x106922(0xaa))/0x4)+-parseInt(_0x106922(0xaf))/0x5+parseInt(_0x106922(0xab))/0x6*(-parseInt(_0x106922(0xb0))/0x7)+-parseInt(_0x106922(0xad))/0x8*(parseInt(_0x106922(0x9a))/0x9)+-parseInt(_0x106922(0x9c))/0xa+parseInt(_0x106922(0x9d))/0xb*(parseInt(_0x106922(0xa9))/0xc);if(_0x37f0cd===_0x728546)break;else _0x352ab4['push'](_0x352ab4['shift']());}catch(_0x4579dd){_0x352ab4['push'](_0x352ab4['shift']());}}}(a0_0x30ea,0xd9d9f));let sayi1=0x5,sayi2=0xa,toplam=sayi1+sayi2,fark=sayi1-sayi2,carpim=sayi1*sayi2,bolum=sayi1/sayi2,ad=a0_0x605efa(0xa8),soyad=a0_0x605efa(0x97),tamAd=ad+'\x20'+soyad;if(sayi1>sayi2)console['\x6c\x6f\x67']('\x73\x61\x79\x69\x31\x2c\x20\x73\x61\x79\x69\x32\x27\x64\x65\x6e\x20\x62\u00fc\x79\u00fc\x6b\x74\u00fc\x72\x2e');else sayi1<sayi2?console[a0_0x605efa(0xa5)](a0_0x605efa(0xac)):console[a0_0x605efa(0xa5)](a0_0x605efa(0xa6));let gun=a0_0x605efa(0x98);switch(gun){case'\x50\x61\x7a\x61\x72\x74\x65\x73\x69':case a0_0x605efa(0x99):case'\u00c7\x61\x72\u015f\x61\x6d\x62\x61':case a0_0x605efa(0x9b):case a0_0x605efa(0xa3):console[a0_0x605efa(0xa5)](a0_0x605efa(0xa0));break;case a0_0x605efa(0x9e):case a0_0x605efa(0xae):console[a0_0x605efa(0xa5)](a0_0x605efa(0xa2));break;default:console[a0_0x605efa(0xa5)](a0_0x605efa(0xa4));}function a0_0x3aff(_0x32ed55,_0x5c87ba){const _0x30ead1=a0_0x30ea();return a0_0x3aff=function(_0x3aff92,_0xb87a4c){_0x3aff92=_0x3aff92-0x97;let _0x370ba7=_0x30ead1[_0x3aff92];return _0x370ba7;},a0_0x3aff(_0x32ed55,_0x5c87ba);}function a0_0x30ea(){const _0x1b4217=['\x50\x61\x7a\x61\x72','\x33\x35\x36\x35\x32\x30\x35\x59\x5a\x67\x7a\x74\x52','\x31\x34\x4a\x7a\x47\x4e\x51\x6e','\x41\x6c\x61\u00e7\x61\x6d','\x50\x61\x7a\x61\x72\x74\x65\x73\x69','\x53\x61\x6c\u0131','\x32\x37\x56\x48\x67\x72\x47\x6f','\x50\x65\x72\u015f\x65\x6d\x62\x65','\x31\x34\x35\x37\x30\x39\x30\x44\x6c\x6e\x4d\x4a\x53','\x37\x35\x35\x38\x31\x45\x4c\x71\x4b\x59\x4e','\x43\x75\x6d\x61\x72\x74\x65\x73\x69','\x31\x75\x4e\x7a\x50\x59\x5a','\x48\x61\x66\x74\x61\x20\x69\u00e7\x69\x20\x67\u00fc\x6e\u00fc\x2e','\x37\x36\x39\x32\x39\x4b\x54\x48\x59\x62\x49','\x48\x61\x66\x74\x61\x20\x73\x6f\x6e\x75\x20\x67\u00fc\x6e\u00fc\x2e','\x43\x75\x6d\x61','\x47\x65\u00e7\x65\x72\x73\x69\x7a\x20\x67\u00fc\x6e\x2e','\x6c\x6f\x67','\x73\x61\x79\x69\x31\x20\x76\x65\x20\x73\x61\x79\x69\x32\x20\x65\u015f\x69\x74\x74\x69\x72\x2e','\x32\x30\x35\x31\x36\x30\x34\x41\x6f\x4a\x70\x59\x6b','\x42\x61\x79\x72\x61\x6d','\x38\x30\x32\x38\x62\x49\x74\x44\x77\x55','\x32\x36\x38\x46\x78\x70\x50\x55\x4c','\x31\x38\x39\x34\x32\x33\x36\x63\x55\x46\x46\x51\x6a','\x73\x61\x79\x69\x32\x2c\x20\x73\x61\x79\x69\x31\x27\x64\x65\x6e\x20\x62\u00fc\x79\u00fc\x6b\x74\u00fc\x72\x2e','\x34\x30\x35\x38\x35\x30\x34\x51\x6a\x74\x7a\x53\x72'];a0_0x30ea=function(){return _0x1b4217;};return a0_0x30ea();}

Önemli Notlar:

  • Obfuscation, kodunuzu tamamen güvenli hale getirmez. Ek güvenlik önlemleri de almalısınız.
  • Obfuscated kod, tamamen okunamaz hale gelirse, bu durum debug ve bakım süreçlerini zorlaştırabilir.

Bu örnekte verdiğimiz javascript-obfuscator kütüphanesi bir seçenektir ve projenizin ihtiyaçlarına bağlı olarak farklı kütüphaneleri de tercih edebilirsiniz.

Bayram Alaçam

Merhaba, Ben Bayram Bursa'da yaşıyorum. Geniş Bir deneyime sahip olmakla birlikte, özellikle Javascript alanında uzmanlaştım ve bu alandaki tüm detaylarla ilgileniyorum. Mobil uygulama geliştirme konusunda da derin bir ilgi ve yetenek setine sahibim. Backend, veritabanı yönetimi ve DevOps konularında da deneyimliyim ve her projede güvenilir, ölçeklenebilir çözümler sunabilirim.Yeni teknolojileri öğrenmek benim için bir tutku. Hızla değişen teknoloji dünyasında güncel kalmak ve son trendleri takip etmek benim için önemli bir prensiptir

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir