
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:
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:
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ı:
- 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.
- Tür:
- 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.
- Tür:
- 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.
- Tür:
- 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.
- Tür:
- 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.
- Tür:
- 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.
- Tür:
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.
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:
// 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:
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.
Bir yanıt yazın