JavaScript'te güvenli kodlama
JavaScript'te güvenli kodlama
JavaScript tüm internetin ön yüzüdür. İster TypeScrit' i JavaScript'e dönüştürün ister hızı küçük node.js betikleri oluşturun, ister çok daha ilginç bir API koleksiyonunu çağıran basit bir ön yüz oluşturun JavaScript kelimenin tam anlamıyla her yerdedir. JavaScript çok yaygın olduğu için saldırganlar i
çin birincil hedeftir. Bu makalede daha güvenli JavaScript yazmak için gerekli olan önemli konuları ele alacağız.
Web sitesinin güvenliği söz konusu olduğunda tartışılması gereken en önemli konu her zaman siteler arası betik çalıştırmadır (XSS). Siteler arası betik çalıştırma, bir tür enjeksiyondur; yani bir saldırgan, uygulamanızı veri olarak ele almak yerine, kötü amaçlı kodlarını yorumlayacak veya çalıştıracak şekilde karıştırmıştır. Kullanıcı girdileri her zaman veri olarak ele alınmalıdır, ancak ne yazık ki dikkatli olmazsak bilgisayarlar kandırılabilir.
XSS, yalnızca JavaScript'te çalışan tek enjeksiyon türüdür. Ayrıca, tarayıcının kontrolünü ele geçirip kurbana karşı kullanarak kullanıcıya doğrudan saldıran tek enjeksiyon türüdür. Diğer tüm enjeksiyon türleri kullanıcıya saldırmaz; örneğin, SQL enjeksiyonu veritabanı sunucusuna, komut enjeksiyonu sistemin çalıştığı ana işletim sistemine ve LDAP enjeksiyonu LDAP sunucusuna saldırır. Durumu anladınız.
XSS ile bir saldırgan, tarayıcıyı kullanarak çerezlerinize (eğer çerezlerinizin içinde güvenli olmayan bir şekilde sakladıysanız oturum bilgileriniz de dahil), harici komut dosyalarına (İçerik Güvenlik Politikası'nı kullanarak bunları kilitlemediyseniz), bir tuş kaydedici yüklemek, web sitenize zarar vermek vb. için erişebilir. JavaScript'in yapamadığı her şeyi bir XSS saldırısı da yapabilir; tek sınır saldırganın hayal gücüdür.
Yıllar geçtikçe çeşitli farkındalık ve eğitim biçimleri (örneğin OWASP Web Uygulamaları için En Önemli 10 Risk ), çıktı kodlamasını otomatik olarak gerçekleştiren yeni JavaScript çerçeveleri ve ekiplerin güvenliği her zamankinden daha ciddiye alması sayesinde XSS vakaları azalsa da ne yazık ki hala yüksek riskli bir sorundur.
XSS'in uygulamalarınızı etkileme olasılığını ortadan kaldırmak için aşağıdaki işlemleri gerçekleştirin:
- Kullanıcı tarafından sağlanan veya değiştirilebilen tüm verilerde giriş doğrulaması gerçekleştirin. Giriş doğrulaması gerçekleştirdikten sonra, potansiyel olarak tehlikeli karakterleri (örneğin <, >, ', “, - vb.) kabul etmeniz gerekiyorsa, uygulamanızı bunlardan kaçınarak (önlerine ters eğik çizgi ekleyerek) veya bunları temizleyerek (başka bir karakterle değiştirerek veya tamamen kaldırarak) korumalısınız.
- Ekranda görüntülenecek her şeyde çıktı kodlaması yapın; buna görüntülenebilecek her şey de dahil (örneğin, ön ucunuz tarafından görüntüleneceğini bildiğiniz bir API'den bir şey döndürüyorsanız). Çerçevenizin bu işi sizin için yapmasını sağlayabilirseniz, bu, doğru şekilde yaptığınızdan emin olmanın en kolay ve genellikle en etkili yoludur. Çıktı kodlaması, özellikle satır içi JavaScript kullanıyorsanız oldukça karmaşık hale gelebilir. Kimse iç içe kodlama yapmak istemez!
- Uygulamanızın bir parçası olarak izin vereceğiniz tüm üçüncü taraf bileşenlerini, özellikle de betikleri listelemek için İçerik Güvenlik Politikası (CSP) başlığını kullanın. Kötü amaçlı bir XSS saldırısının yapacağı ilk şey, internetteki çok daha büyük ve kötü amaçlı başka bir betiğe bağlanmaya çalışmaktır. Çoğu alan yalnızca 50 veya 100 karaktere izin verir; bu da bir saldırı için kod yazmak için yeterli bir alan değildir. İnternetteki kötü amaçlı bir siteye bağlanıp çok daha uzun bir betiği çağırabiliyorlarsa, risk katlanarak artar.
- Çerezlerinize bir bayrak ekleyin
httpsOnly
; böylece bir şeyi gözden kaçırsanız bile, saldırganın çerezlerinizden oturum bilgilerinize asla erişememesi sağlanır. Çerezlerinize erişmeye çalışmak, genellikle bir XSS saldırısının yapmaya çalışacağı ikinci şeydir, bu yüzden bu hassas bilgilere erişmelerine izin vermeyin. - Hiçbir şeyi kaçırmadığınızdan kesinlikle emin olmak için manuel kod incelemesi yapın, statik (SAST) veya dinamik (DAST) bir analiz aracı kullanın veya bir penetrasyon testi gerçekleştirin!